c++ 虚拟继承不起作用,如何使用多个 parents' 成员?
c++ virtual inheritance doesn't work, how do I use the multiple parents' members?
Example of using virtual inheritance
class AA
{
public:
AA() { cout << "AA()" << endl; };
AA(const string& name, int _a):n(name),a(_a) {};
AA(const AA& o) :n(o.n), a(o.a) {};
virtual ~AA() { cout << "~AA()" << endl; };
protected:
int a = 0;
std::string n;
};
class A1 : public virtual AA
{
public:
A1(const string& s) : AA(s, 0){}
};
class A2 : public virtual AA
{
public:
A2(const string& s) : AA(s, 0) {}
};
class B : public A1, public A2
{
public:
B(const string& a1, const string& a2) : A1(a1), A2(a2){}
void test()
{
cout << A1::n << endl;
cout << A2::n << endl;
}
};
void test()
{
B b("abc", "ttt");
b.test();
}
理想情况下,A1::n
为“abc”,A2::n
为“ttt”。但它们都是空的。整个过程只会调用一次AA()
。
我做错了什么?
我傻了。 virtual inheritance
的意思是让成员合二为一。我真正想要的只是成员的2份,只是消除virtual
。
class A {
protected:
int a = 10;
public:
A(int i):a(i){}
virtual ~A(){}
};
class A1 : public /*virtual*/ A
{
public:
A1(int i) :A(i) {};
};
class A2 : public /*virtual*/ A
{
public:
A2(int i) :A(i) {};
};
class B : public A1, public A2
{
public:
B(int a1, int a2): A1(a1), A2(a2) {}
void test()
{
cout << A1::a << endl;
cout << A2::a << endl;
}
};
void test()
{
B(1, 2).test();
cout << sizeof(B);
}
结果是正确的,而真正的原因是当你使用虚继承时,D ctor首先使用AA的默认ctor,n没有赋值。
如果要使用 AA(name, a),则需要在 D.
中显式使用它
Example of using virtual inheritance
class AA
{
public:
AA() { cout << "AA()" << endl; };
AA(const string& name, int _a):n(name),a(_a) {};
AA(const AA& o) :n(o.n), a(o.a) {};
virtual ~AA() { cout << "~AA()" << endl; };
protected:
int a = 0;
std::string n;
};
class A1 : public virtual AA
{
public:
A1(const string& s) : AA(s, 0){}
};
class A2 : public virtual AA
{
public:
A2(const string& s) : AA(s, 0) {}
};
class B : public A1, public A2
{
public:
B(const string& a1, const string& a2) : A1(a1), A2(a2){}
void test()
{
cout << A1::n << endl;
cout << A2::n << endl;
}
};
void test()
{
B b("abc", "ttt");
b.test();
}
理想情况下,A1::n
为“abc”,A2::n
为“ttt”。但它们都是空的。整个过程只会调用一次AA()
。
我做错了什么?
我傻了。 virtual inheritance
的意思是让成员合二为一。我真正想要的只是成员的2份,只是消除virtual
。
class A {
protected:
int a = 10;
public:
A(int i):a(i){}
virtual ~A(){}
};
class A1 : public /*virtual*/ A
{
public:
A1(int i) :A(i) {};
};
class A2 : public /*virtual*/ A
{
public:
A2(int i) :A(i) {};
};
class B : public A1, public A2
{
public:
B(int a1, int a2): A1(a1), A2(a2) {}
void test()
{
cout << A1::a << endl;
cout << A2::a << endl;
}
};
void test()
{
B(1, 2).test();
cout << sizeof(B);
}
结果是正确的,而真正的原因是当你使用虚继承时,D ctor首先使用AA的默认ctor,n没有赋值。 如果要使用 AA(name, a),则需要在 D.
中显式使用它