c++ - 有没有办法向上转换成一个抽象类并且每次从它派生一个类时都不修改它?

标签 c++ virtual abstract-class derived-class

#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)的目的。 byesayon​​ara 都做同样的事情(说再见),只是使用不同的语言。这意味着您应该有一个抽象的 say_goodbye 方法,该方法会被子类覆盖。我想这是一个简化的示例,所以也许您可以描述您的实际情况,以便我们提供更具体的帮助。

编辑 如果您想通过抽象接口(interface)创建派生类的拷贝,请查看this question .如果您想显式访问子类的不同属性,您应该问问自己,在这里子类化是否合适,因为您的类似乎没有太多共同点。

关于c++ - 有没有办法向上转换成一个抽象类并且每次从它派生一个类时都不修改它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3829220/

相关文章:

c++ - “CObject::CObject”:无法访问类 'CObject' 中声明的私有(private)成员

c++ - Eclipse,C/C++,链接同一工作区中的两个项目

.net - 导航到通用定义实体的正确方法

C++链表在删除具有重复值的节点时会出现段错误

C++:是否可以将模板类的所有实例都加为好友?

c++ - 另一个与设计相关的 C++ 问题

C++ 链接时对基类函数的 undefined reference (--不是--vtables、构造函数、模板或纯虚函数)

java - GTK 2/3 是否支持高效的虚拟表?

c++ - 如何在链表中显示特定节点?

c++ - 编译器生成的抽象基类的析构函数是虚拟的吗?