我正在扩展现有的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;
}
答案 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;
}