如何创建具有多重继承的子类,继承指定构造函数的所需值?

问题描述 投票:0回答:1

你好我目前正在学习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
c++ inheritance multiple-inheritance
1个回答
0
投票

我修改了代码以显示对象 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 析构函数调用

一个名为

的析构函数
© www.soinside.com 2019 - 2024. All rights reserved.