class A { public: void eat(){ cout<<"A";} }; class B: virtual public A { public: void eat(){ cout<<"B";} }; class C: virtual public A { public: void eat(){ cout<<"C";} }; class D: public B,C { public: void eat(){ cout<<"D";} }; int main(){ A *a = new D(); a->eat(); } ダイヤモンドの問題を理解しています。上記のコードにはその問題はありません。 …
単純な単一継承を使用する場合、派生クラスのアドレスは基本クラスのアドレスと同じであることは誰もが知っています。多重継承はそれを真実にしません。 仮想継承もそれを正しくありませんか?つまり、次のコードは正しいですか。 struct A {}; struct B : virtual A { int i; }; int main() { A* a = new B; // implicit upcast B* b = reinterpret_cast<B*>(a); // fishy? b->i = 0; return 0; }