Path: csiph.com!news.mixmin.net!eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail From: Stefan Reuther Newsgroups: de.comp.lang.iso-c++ Subject: =?UTF-8?Q?Re=3a_Eigenartiges_Verhalten_von_=c3=bcberschriebenen_vir?= =?UTF-8?Q?tuellen_Methoden?= Date: Fri, 9 Sep 2022 17:47:27 +0200 Organization: A noiseless patient Spider Lines: 36 Sender: "Moderation de.comp.lang.iso-c++" Approved: Markus Schaaf Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Info: reader01.eternal-september.org; posting-host="f5db78fa4d1732b4083dea5948bbaf05"; logging-data="1169212"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+BPx9PkxJ/4soLRKkz/Q/N" User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.12.1 Hamster/2.1.0.1538 Xref: csiph.com de.comp.lang.iso-c++:2154 Am 09.09.2022 um 00:42 schrieb Michael Landenberger: > Wie kann ich es erreichen, dass beim Aufruf des > Konstruktors von CBase über den Konstruktor eines Objekts der Klasse CDerived > *nicht* CBase::getName(), sondern CDerived::getName() aufgerufen wird? Gar nicht, da das CBase-Objekt zu dem Zeitpunkt noch nicht weiß, dass es mal ein CDerived werden wird. Eine Möglichkeit wäre, die Klassenstruktur derart zu gestalten, dass CBase ein pur virtuelles Interface ohne Logik ist, und die Logik in einer weiteren Klasse liegt: class CBase { public: virtual string getName() = 0; }; class CDerived : public CBase { public: string getName() override { return "abgeleitete Klasse"; } }; class CLogic { public: CLogic(std::unique_ptr pImpl) : m_pImpl(std::move(pImpl)) { m_name = m_pImpl->getName(); } private: std::unique_ptr m_pImpl; string m_name; }; Dann ist das CDerived garantiert schon fertig, wenn die Konstruktion des CLogic beginnt. Stefan