c++【钻石配置】如何用继承初始化?

Posted

技术标签:

【中文标题】c++【钻石配置】如何用继承初始化?【英文标题】:c++ [diamond configuration] How to initialize with inheritance? 【发布时间】:2021-07-05 10:08:30 【问题描述】:

如果我的问题很愚蠢,我深表歉意,但我是 C++ 的初学者。我正在研究钻石继承,我想知道是否可以选择特定的父类来初始化子类的属性。

总结一下,我希望这段代码输出B

感谢您的回答!

PS:我正在使用 c++98

#include <iostream>

class A

    protected:
        char    m_char;
    public:
        A(): m_char('A');
        char    getChar()return m_char;;
        ~A();
;

class B : virtual public A

    private:
        
    public:
        B() m_char = 'B';;
        ~B();
;

class C : virtual public A

    private:
        
    public:
        C() m_char = 'C';;
        ~C();
;

class D : public B, public C

    private:
        
    public:
        D() m_char = B::m_char;;
        ~D();
;

int main(void)

    D   d;
    std::cout << d.getChar() << std::endl;

【问题讨论】:

class D : public C, public B ;? 【参考方案1】:

虚拟基类按深度优先、从左到右的顺序初始化。因此,您需要在继承中将 B 命名为第二个,以便 D 最后调用其构造函数,从而在最后将变量设置为 B。


class D : public C, public B

【讨论】:

"to name B second" 拟用于提议重新排序字母 :-) 是的,我注意到了。但我想知道是否有办法选择它应该继承哪个类。例如:如果我有两个属性,一个从 B 继承,另一个从 C 继承。可以这样做吗? 你的意思是如果你在B和C中声明一个同名的成员变量?这是不可能的。如果您在 B 和 C 中定义了变量 foo,那么您可以像这样访问它:d.B::foo【参考方案2】:

m_char = B::m_char; 是自赋值(m_char 只有一个)。

在虚拟继承中,它是初始化虚拟类的最派生类(主体做赋值)。

如何在构造中显式:

#include <iostream>

class A

protected:
    char m_char;
public:
    A() : m_char('A') 
    char getChar() const  return m_char; 
    virtual ~A() 
;

class B : virtual public A

public:
    B() : A('B') 
;

class C : virtual public A

public:
    C() : A('C') 
;

class D : public B, public C

public:
    D() : A('B'), B(), C() 
;

int main()

    D d;
    std::cout << d.getChar() << std::endl;

【讨论】:

以上是关于c++【钻石配置】如何用继承初始化?的主要内容,如果未能解决你的问题,请参考以下文章

如何用spring实现定时器任务的执行(定时器执行时间可以从数据库获取)

如何用rflask快速初始化Flask Restful项目

如何用console线连接路由器进行初始配置-----无私奉献版(转载请注明出处)

教你如何用C++创建一个特殊的类

如何用python给女朋友挑钻石(seaborn画图入门)

Python菱形继承的初始化问题和继承顺序