当我尝试编译以下代码时:

class A {
public:
    A(int v) : virt(v) { }
    int virt;
    int getVirt(void) const { return virt; }
};

class B : private virtual A {
protected:
    B(int v) : A(v) { }
    using A::getVirt;
};

class C : public B, private virtual A {
protected:
    C(int v) : A(v), B(v) { }
    using A::getVirt;
};

class D : public C {
public:
    D(void) : C(3) { }
    using C::getVirt;
};

#include <iostream>

int main(int argc, char *argv[]) {
    D d;
    std::cout << "The number is: " << d.getVirt() << std::endl;

    return 0;
}

我收到关于D的一个错误,没有实例化A;那是对的吗?如果将虚拟基础嵌入到层次结构中,那么实际上所有派生类也都需要从该基础派生吗,以便它们可以调用虚拟基础的参数构造函数?

顺便说一句,这是G++产生的错误:
Main.cpp: In constructor ‘D::D()’:
Main.cpp:22:18: error: no matching function for call to ‘A::A()’
Main.cpp:22:18: note: candidates are:
Main.cpp:3:5: note: A::A(int)
Main.cpp:3:5: note:   candidate expects 1 argument, 0 provided
Main.cpp:1:7: note: A::A(const A&)
Main.cpp:1:7: note:   candidate expects 1 argument, 0 provided

最佳答案

正如Kerrek SB所提到的,您需要在A的构造函数中初始化D

但是,还必须明确告诉编译器,您是,而不是使用范围运算符从其(私有(private))派生上下文访问A

class D : public C {
public:
    D(void) : ::A(3), C(3) { }
//            ^^ Access this constructor from a global context
    using C::getVirt;
};

这也意味着您的构造函数必须是公共(public)的,就像您的代码一样。

09-11 19:30
查看更多