c++ - 我可以对来自不同基类的相同功能实现不同的实现吗?

标签 c++ inheritance

假设如下:

class A{ virtual void f() = 0; };
class B{ virtual void f() = 0; };

我能否以某种方式执行以下操作?

class C : public A, public B
{
  virtual void A::f(){ printf("f() from A"); }
  virtual void B::f(){ printf("f() from B"); }
};

那么现在我可以做什么了???

A* pa = new C();
pa->f(); // prints f() from A;
B* pb = (B*)pa;
pb->f(); // prints f() from B;

谢谢!!!

最佳答案

第一个解决方案

这个问题提醒了“外观”设计模式。 这应该重写为:

class AC : public A
{ public: virtual void f(){ cout << "f() from A" << endl;}; };

class BC : public B ...

class C : public AC, public BC {};

其中 C 是“外观”。

所以在正确的调用语法中应该是这样的:

C* c = new C();
c->AC::f();
c->BC::f();

如果您在 AC 和 BC 之间没有任何共享限制,这应该可以完成工作,因为它没有被混淆。

第二种方案

另一种解决方案,感谢 Casey(请参阅第一条评论),是在模板中使用类 C 的前向声明,以允许调用后者定义的方法。

template <typename C>
class AC : public A {
public:
    void f() { static_cast<C&>(*this).f_from_A(); }
};

template <typename C>
class BC : public B { ... };

因此实现部分可以在同一个类中完成。

class C : public AC<C>, public BC<C> {
public:
    void f_from_A() { cout << "f_from_A" << endl; };
    void f_from_B() ...
};

调用部分更清晰,因为它没有显示任何实现细节并且它最接近问题:

C* c = new C();
((A*) c) -> f();
((B*) c) -> f();

C 上不再有“默认”f(),可能会破坏继承的预期行为,而且更难阅读。

关于c++ - 我可以对来自不同基类的相同功能实现不同的实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20730683/

相关文章:

c++ - boost::uint32_t != std::uint32_t 对于 ARM 目标

c++ - 以键作为结构的映射加法

delphi - 为什么在重载基类中引入的抽象方法时编译器会发出警告?

具有返回类型的 Java 继承方法

java - 将非重写派生类方法的方法引用传递给其基类是否合法且已定义?

inheritance - 是否可以将 Swift 泛型类函数返回类型限制为同一个类或子类?

c++ - 哪种方法更适合为函数提供编译时间常量?函数参数与模板参数

c++ - 在 C++ 中使用 ifstream 打开和关闭后,.txt 文件不再由 snmptrapd 守护进程写入

c++ - 使用自定义排序函数对 vector<string> 中的字符串进行排序时出现段错误

ios - 一个类继承另一个类并遵守一个协议(protocol)——试图调和两个​​接口(interface)