#include<iostream>
using namespace std;
class Abs
{
public:
virtual void hi()=0;
};
class B:public Abs
{
public:
void hi() {cout<<"B Hi"<<endl;}
void bye() {cout<<"B Bye"<<endl;}
};
class C:public Abs
{
public:
void hi() {cout<<"C Hi"<<endl;}
void sayonara() {cout<<"C Sayonara"<<endl;}
};
int main()
{
Abs *bb=new B;
bb->bye();
Abs *cc=new C;
cc->sayonara();
}//main
编译器说
test2.cpp: In function ‘int main()’:
test2.cpp:26: error: ‘class Abs’ has no member named ‘bye’
test2.cpp:28: error: ‘class Abs’ has no member named ‘sayonara’
由于这个问题,每次我创建一个继承自它的新派生类时,我都必须向 Abs 类添加函数(向上转型对我来说是强制性的。我正在计划的程序要求它是所以)。基类创建后我不想再碰它。 这个问题是不是违反了基类一旦做了,就永远不用修改的原则。有什么办法可以解决这个问题? p.s: 我看过工厂设计模式和原型(prototype)设计模式,但是这两个好像都解决不了。
最佳答案
这违背了继承和抽象接口(interface)的目的。 bye
和 sayonara
都做同样的事情(说再见),只是使用不同的语言。这意味着您应该有一个抽象的 say_goodbye
方法,该方法会被子类覆盖。我想这是一个简化的示例,所以也许您可以描述您的实际情况,以便我们提供更具体的帮助。
编辑 如果您想通过抽象接口(interface)创建派生类的拷贝,请查看this question .如果您想显式访问子类的不同属性,您应该问问自己,在这里子类化是否合适,因为您的类似乎没有太多共同点。
关于c++ - 有没有办法向上转换成一个抽象类并且每次从它派生一个类时都不修改它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3829220/