如何使用另一个父函数来满足父类纯虚函数的定义

时间:2010-09-15 20:06:12

标签: c++ gcc g++ vtable pure-virtual

我正在扩展现有的C ++项目。我有一个派生自两个父类的基类。其中一位父母拥有纯粹的虚拟功能。我希望纯虚函数由另一个父实现的函数定义。

所以,我希望另一个父类满足基类定义父类纯虚函数的义务。我尝试过两种方法,都会导致编译错误 有什么想法吗?

这是一个C ++程序,展示了我的第一个想法,希望编译器只使用base2的{​​{1}}定义。

vfunc()

编译器报告// This is my first approach, hoping the parent base2 of derived would satisfy the need to define // base1's pure virtual vfunc. class base1 { public: virtual int vfunc() = 0; }; class base2 { public: int vfunc() { return 0;} //defined }; class derived : public base1, public base2 { public: //empty }; int main() { derived d; base1 & b1 = d; int result = b1.vfunc(); return result; } 仍然是一个抽象类:

derived

这是我的第二次尝试:

$ gcc a.cc 
a.cc: In function ‘int main()’:
a.cc:26: error: cannot declare variable ‘d’ to be of abstract type ‘derived’
a.cc:18: note:   because the following virtual functions are pure within ‘derived’:
a.cc:7: note:  virtual int base1::vfunc()

我实际上期望这样做是为了我,但链接器给了我一堆我不理解的vtable错误:(Mac OS 10.6,gcc 4.2.1)

// This is my second attempt, defining a vfunc in the derived class that calls the other parent.

class base1 {
public:
 virtual int vfunc() = 0;
};

class base2 {
public:
 int vfunc() { return 0; } // defined
};

class derived : public base1, public base2 {
public:
 int vfunc() { return base2::vfunc(); } // call the other parent's vfunc
};

int main()
{
 derived d;
 base1 & b1 = d;
 int result = b1.vfunc();
 return result;
} 

3 个答案:

答案 0 :(得分:3)

您需要覆盖vfunc的{​​{1}}。你可以这样做:

base1

答案 1 :(得分:2)

你的第二段代码很好,你只是没有正确编译它。你需要用g ++编译,而不是gcc。使用g ++编译时,它会自动链接到C ++运行时库中;当你用gcc编译时,它没有。您也可以自己手动添加它们:

# Option 1: compile with g++
g++ inheritance_tester.cc

# Option 2: compile with gcc and link with the C++ standard libraries
gcc inheritancet_test.cc -lstdc++

答案 2 :(得分:0)

derived的这个修改版本在Visual C ++上为我工作。对我来说意味着你必须明确消除两个继承的vfunc()的歧义。

class base1 {
public:
    virtual int vfunc() = 0;
};

class base2 {
public:
    int vfunc() { return 0;} //defined
};

class derived : public base1, public base2 {
public:
    int base1::vfunc() { return base2::vfunc(); } // call the other parent's vfunc
};

int main()
{
    derived d;
    base1 & b1 = d;
    int result = b1.vfunc();
    return result;
}