2011-03-19 59 views
0

我有一个虚拟内联getter和setter的A类。从A有两个类B和C派生。我有一个D类,来自B和C. Creatown D中的一个对象,并使用getName()结果“未定义的引用getName()”。删除“联机”do not't工作。头文件包含正确。 这里有什么问题?未定义的引用,但它被定义为

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

你真的想虚拟继承? – 2011-03-19 09:01:11

+1

显示问题的粘贴代码。上面的代码不显示它。 – wilx 2011-03-19 09:02:56

+0

[gcc C++虚拟继承问题]的可能重复(http://stackoverflow.com/questions/2126522/gcc-c-virtual-inheritance-problem) – 2011-03-19 09:07:32

回答

2

您的代码编译好有/无inlinewith inlinewithout inline

但除此之外,记住这一点:在一个虚拟继承,你已经初始化基地明确如果基类构造函数接受参数为,

class D : public B, public C 
{ 
    public: 
     D(string s) : A(s), B(s), C(s){} 
        //^^^^ note this! 

}; 

只是​​是不够的:http://ideone.com/MPUPj

A(s)需要:http://ideone.com/DNLkA

更多细节请参见本主题:about virtual base class and virtual inheritance in C++

+0

不,您不必显式初始化虚拟基础是默认构造的,在这种情况下它是。没有? – 2011-03-19 09:15:36

+0

编译器是否会生成一个工作的默认构造函数,因为在问题的代码中没有定义构造函数? – rve 2011-03-19 09:18:45

+0

@阿门:你说得对。我错过了这一点。更新了我的答案! – Nawaz 2011-03-19 09:20:45