我有一个问题: 如何在派生自抽象类的类中实现非虚函数?例如:
class A {
public:
virtual void foo() = 0;
};
class B : public A{
public:
virtual void foo() {
/* some code */
}
//B function
void Bfoo(){
/* some code */
}
};
int main(){
A* a = new B;
a -> foo();
a -> Bfoo();
return 0;
}
g ++获得:
error: ‘class A’ has no member named ‘Bfoo’
a -> Bfoo();
有没有办法使用多态并使用非虚函数?
修改
我知道A没有Bfoo()
功能所以我得到了错误。我问了这个问题,因为我不明白什么时候有用多态。
我的回答可能是:
当我的派生类具有所有相同的函数并从一个公共基类派生时,我使用多态。
但是如果一个类有另一个函数,那么多态性会下降吗?
答案 0 :(得分:0)
如果要将函数Bfoo()
与指针a
一起使用,则必须将函数Bfoo()
添加到class A
virtual
。
我的意思是
class A {
public:
virtual void foo() = 0;
virtual void Bfoo() {} //this line is necessary
};
编辑(问题更改后)
定义知识是必要的。以下是cplusplus.com
中虚拟成员的定义虚拟会员
虚拟成员是一个成员函数,可以在派生类中重新定义,同时通过引用保留其调用属性。函数变为虚拟的语法是在其声明之前使用虚拟关键字。
有关多态性和虚拟函数/成员的定义,请参阅resource。
答案 1 :(得分:0)
派生类可以具有其他非虚函数,但必须从指针或对派生类的引用调用。
多态性的要点是调用代码不必关心它所作用的变量的具体类。
通常,此类方法将成为类的私有实现的一部分,而不是公共接口的一部分。派生类中的任何非虚拟面向公共的方法都会隐式强制调用代码知道类的具体类型。
你当然可以将你的A*
投射到B*
,但这种方式会破坏多态性。如果没有具体的例子,你很难提出更具体的建议。