【问题标题】:Using inheritance from concrete class to implement pure virtual method C++使用从具体类的继承来实现纯虚方法 C++
【发布时间】:2012-12-12 05:56:21
【问题描述】:

我想使用实现从接口实现纯虚拟方法 由具体类提供,而不必显式调用具体类中的方法。示例:

class InterfaceA{  
public:  
    virtual void foo() = 0;  
};

class InterfaceB:public InterfaceA{  
public:  
   virtual void bar() = 0;  
};

class ConcreteA : public InterfaceA{  
public:  
   virtual void foo(){}//implements foo() from interface  
};

class ConcreteAB: public InterfaceB, public ConcreteA{  
public:  
    virtual void bar(){}//implements bar() from interface  
};

在这种情况下,编译器要求在 ConcreteAB 类中实现 foo(),因为 InterfaceB 没有实现它并且它继承自 InterfaceA。

有一种方法可以告诉编译器使用来自 ConcreteA 的实现而不使用调用 ConcreteA::foo() 的包装器?

【问题讨论】:

  • 代码看起来不错:liveworkspace.org/code/2W44n2$3
  • 一旦我添加了; 你缺少的东西,这在 g++ 4.5 上编译得很好。你能告诉我们导致问题的真实代码吗?
  • 我不想这样做。我想告诉编译器该实现是从 ConcreteA 提供的,而不使用包装器/存根。有办法吗?
  • ideone.com/aN0Eam - 你的编译器有问题。
  • 粘贴您收到的错误消息

标签: c++ interface multiple-inheritance pure-virtual


【解决方案1】:

InterfaceA 设为虚拟基类。

class InterfaceB : public virtual InterfaceA {  
public:  
   virtual void bar() = 0;  
};

class ConcreteA : public virtual InterfaceA {  
public:  
   virtual void foo(){}//implements foo() from interface  
};

【讨论】:

  • 非常感谢!那是关键=D
【解决方案2】:

你需要virtual inheritance

位于层次结构顶部的接口 A 实际上应该由所有直接子类继承。

class InterfaceB:public virtual InterfaceA{  
public:  
   virtual void bar() = 0;  
};

class ConcreteA : public virtual InterfaceA{  
public:  
   virtual void foo(){}//implements foo() from interface  
};

【讨论】:

    猜你喜欢
    • 2016-10-08
    • 1970-01-01
    • 2023-03-06
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 2012-12-12
    相关资源
    最近更新 更多