我有一个带有虚拟内联getter和setter的A类。从A开始有两个B和C类派生。我有一个D级,来自B和C. 从D创建一个对象并使用getName()导致“对getName()的未定义引用”。删除“内联”不起作用。头文件包含正确。 这有什么问题?
class A
{
public:
virtual inline std::string getName() const{return name;}
protected:
std::string name;
};
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};
答案 0 :(得分:2)
您的代码可以使用/ inline
进行编译:with inline和without inline
但请记住这一点:在虚拟继承中,如果基类构造函数将参数视为,则必须显式初始化基数,
class D : public B, public C
{
public:
D(string s) : A(s), B(s), C(s){}
//^^^^ note this!
};
仅D(string s) : B(s), C(s)
还不够:http://ideone.com/MPUPj
A(s)
还需要:http://ideone.com/DNLkA
有关详细信息,请参阅此主题:about virtual base class and virtual inheritance in C++