你好我目前正在学习c++并且我遇到了多重继承的问题。我做了一个简单的程序,其中有 4 个类:A、B、C 和 D A 是父类,B 和 C 是 A 的子类,D 是 B 和 C 的子类。
我的问题是,我希望 D 对象的值初始化为他在构造函数中声明的那样,通过取 A::a 的值为 a 的值为 4,但我得到的是值 1,更准确地说是所有值D 是前一个构造函数的值,在这种情况下是 C?如何使 D 像 D 构造函数中所述那样选择指定构造函数的值?首先是 A 类的实现:
class A
{
public:
A(int a, int b):a(a),b(b)
{
a = 4;
std::cout << "Value of a in A is: " << a << std::endl;
std::cout << "Value in b in A is: " << b << std::endl;
};
~A(){std::cout << "A destructor called\n";}
protected:
int a;
int b;
int c;
};
B的实施:
class B : virtual public A
{
public:
B(int a):A(a, 0)
{
b = 5;
c = 7;
std::cout << "Value of b in B is: " << b << std::endl;
std::cout << "Value in c in B is: " << c << std::endl;
};
~B(){std::cout << "B destructor called\n";}
};
C的实施
class C : virtual public A
{
public:
C(int a):A(a, 0)
{
b = 8;
c = 9;
std::cout << "Value of b in C is: " << b << std::endl;
std::cout << "Value in c in C is: " << c << std::endl;
};
~C(){std::cout << "C destructor called\n";}
};
D的实现
class D: public B, public C
{
public:
D(int a):A(a, 0),B(a),C(a)
{
a = A::a;
b = B::b;
c = C::c;
std::cout << "Value in D for a is " << a
<< " for b is " << b
<< " and for c is " << c << std::endl;
};
~D(){std::cout << "D destructor called\n";}
};
和主要的:
int main (void)
{
D test(1);
}
这是程序的输出
Value of a in A is: 4
Value in b in A is: 0
Value of b in B is: 5
Value in c in B is: 7
Value of b in C is: 8
Value in c in C is: 9
Value in D is a = 4 and b = 5 and c = 9
D destructor called
C destructor called
B destructor called
A destructor called
但是我预计输出是
Value of a in A is: 4
Value in b in A is: 0
Value of b in B is: 5
Value in c in B is: 7
Value of b in C is: 8
Value in c in C is: 9
Value in D is a = 1 and b = 8 and c = 9
D destructor called
C destructor called
B destructor called
A destructor called
我修改了代码以显示对象 test 中只能有 1 个 A。如果我们使用 D(int a):B(a),C(a) 代码不会构建,因为编译器不知道 A 在哪里。因此,如果我们使用 D(int a):A(a, 10),B(a),C(a) ,D 会创建自己的 A,并且在调用 B 和 C 的构造函数时不会调用 A 的构造函数。如果将创建 test1,则 C 的构造函数将创建它自己的 A 并使用零除法调用 A 的构造函数。只是为了显示测试仅使用 A(a, 10) 调用 A 的构造函数一次。
class A
{
public:
A(int _a, int _b):a(_a),b(100/_b)
{
std::cout << "Value of a in A is: " << a << std::endl;
std::cout << "Value in b in A is: " << b << std::endl;
};
~A(){std::cout << "A destructor called\n";}
protected:
int a;
int b;
int c;
};
class B : virtual public A
{
public:
B(int a):A(a, 0)
{
//b = 5;
c = 7;
std::cout << "Value of b in B is: " << b << std::endl;
std::cout << "Value in c in B is: " << c << std::endl;
};
~B(){std::cout << "B destructor called\n";}
};
class C : virtual public A
{
public:
C(int a):A(a, 0)
{
//b = 8;
c = 9;
std::cout << "Value of b in C is: " << b << std::endl;
std::cout << "Value in c in C is: " << c << std::endl;
};
~C(){std::cout << "C destructor called\n";}
};
class D: public B, public C
{
public:
D(int a):A(a, 10),B(a),C(a)
//D(int a):B(a),C(a) // will not build
{
//a = A::a;
//b = B::b;
//c = C::c;
std::cout << "Value in D for a is " << a
<< " for b is " << b
<< " and for c is " << c << std::endl;
};
~D(){std::cout << "D destructor called\n";}
};
int main (void)
{
D test(1);
//C test1(1); // produces an exception
}
A中a的值为:1
A 中 b 的值为:10
B中b的值为:10
B 中 c 的值是:7
C中b的值为:10
C中c的值为:9
D 中 a 的值是 1,b 是 10,c 是 9
D 析构函数调用
C 析构函数调用
B 析构函数调用
一个名为
的析构函数