C++ c++;多态性与非虚函数
我有一个问题: 如何在从抽象类派生的类中实现非_虚函数?例如:C++ c++;多态性与非虚函数,c++,polymorphism,C++,Polymorphism,我有一个问题: 如何在从抽象类派生的类中实现非_虚函数?例如: class A { public: virtual void foo() = 0; }; class B : public A{ public: virtual void foo() { /* some code */ } //B function void Bfoo(){ /* some co
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()
函数,所以我得到了错误。我问这个问题是因为我不明白什么时候使用多态性是有用的
我的答案可能是:
当我的派生类具有所有相同的函数并且派生自一个公共基类时,我使用多态性
但是如果一个类有另一个函数,多态性就会下降?如果你想将函数
Bfoo()
与指针a
一起使用,你必须将函数Bfoo()
作为virtual
添加到类a
我是说
class A {
public:
virtual void foo() = 0;
virtual void Bfoo() {} //this line is necessary
};
编辑(问题更改后) 对定义的了解是必要的。以下是中虚拟成员的定义 虚拟成员
虚拟成员是可以在派生类中重新定义的成员函数,同时通过引用保留其调用属性。函数变为虚拟函数的语法是在其声明之前加上virtual关键字
有关多态性和虚拟函数/成员的定义,请参见。派生类可以有其他非虚拟函数,但必须通过指向派生类的指针或引用调用它们 多态性的要点是调用代码不必关心它所作用的变量是什么具体类 通常,此类方法是类的私有实现的一部分,而不是公共接口的一部分。派生类中的任何非虚拟面向公共的方法都会隐式地强制调用代码知道类的具体类型
当然,你可以将你的
A*
转换成B*
,但是这种转换会破坏多态性。如果没有一个具体的例子来说明你想做什么,就很难给出更具体的建议。不清楚你期望会发生什么A
没有这样的方法,很明显,为什么不能从A
的指针调用它。这听起来像是一个XY问题,请描述一下您试图实现的目标。((B*)a)->Bfoo()
?@PatrickRoberts此修复方案可行,但它太强调多态性的意义了。如果我使用((B*)a)->Bfoo()
我可以使用B*a=new B
而不是a*B=new B
是的,但这不是重点。关键是,您可以将类A类型转换为类B,因为它是派生的。否则,在没有定义成员函数的类的实例上调用成员函数是没有意义的。是的,类可以添加不在其基类中的函数<代码>等级飞机:公共交通工具{公共:无效起飞();无效着陆();}您认为这个示例有什么问题吗?您好,如果我只是将类B
作为派生类,那么这个解决方案可能是正确的,但是同时将类C:public A
作为派生类呢?我应该用空的{}
实现Bfoo()
,但是我的程序界面很差,根本不可读,谢谢你的回复。目前还没有一个例子。当我试图解决一个练习时,我想到多态性,问题就出现了。也许我需要更多地研究这个(重要的)论点,更好地理解多态性的观点。