【问题标题】:C++ is it possible to make a class extend one class and be a realization of an interface at the same time?C++ 是否可以让一个类扩展一个类并同时实现一个接口?
【发布时间】:2011-01-16 11:02:16
【问题描述】:

您能提供一个简单的代码示例吗? (对不起 C++ nube)以及如何从您正在扩展的类中调用函数?

【问题讨论】:

  • 您能否更具体地说明您想要实现的目标?你想重载一个方法并调用该方法的父版本还是只调用一个继承的方法?
  • 请澄清您的问题。你想达到什么目的?您是否有必须满足的规范?请复制粘贴。尽可能具体,以便其他人能够理解您的问题,以便他们有可能给您一个有意义的答案。

标签: c++ oop inheritance extension-methods implementation


【解决方案1】:

一个有用的例子::-)

class CImplementation
{
public:
void doFoo();
};

void CImplementation::doFoo()
{
//implementation
}

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

class DerivedFromImplementationAndInterface : public CImplementation, public IInterface
{
virtual void foo();
};

void DerivedFromImplementationAndInterface::foo()
{
doFoo();
}


//possible usage:
void method(IInterface& aInterface)
{
aInterface.foo();
}

void test()
{
IInterface* d = new DerivedFromImplementationAndInterface;
method(*d);
}

【讨论】:

    【解决方案2】:

    在 C++ 中,您可以扩展多个类,这称为多重继承。很可能这就是您要寻找的。请阅读一本关于多继承和C++的好书(快速介绍:http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr134.htm),因为有很多陷阱和细节需要注意。

    多重继承示例:

    class A { ... };
    class B { ... };
    class C: public A, public B {};  // C inherits from A and B.
    

    【讨论】:

    • 我相信这是最简单的答案。我和@pts 一起推荐阅读一本关于多重继承陷阱的好书(或网页),然后再使用它们。如果您“必须”使用多重继承,那么建议使用一个基类,而另一个仅作为接口(即没有任何成员变量)。
    【解决方案3】:

    C++ 没有明确的接口,Java 中的接口等价物通常用一个只有纯虚函数(加上构造函数、析构函数、复制赋值)的类来实现:

    #include <iostream>
    
    // interface
    class Fooable {
      public:
        virtual int foo() = 0;
        virtual ~Fooable() {}
    };
    
    // base class
    class Base {
      public:
        void non_virtual_function() { std::cout << "Base::non_virtual_function\n"; }
        virtual void virtual_function() { std::cout << "Base::virtual_function\n"; }
    };
    
    // derived class, inherits from both Base "class" and Fooable "interface"
    class Derived: public Base, public Fooable {
      public:
        virtual int foo() {
          // call base class function
          Base::non_virtual_function();
          // virtual call to function defined in base class, overridden here
          virtual_function();
        }
        virtual void virtual_function() {
            // call base class implementation of virtual function directly (rare)
            Base::virtual_function();
            std::cout << "Derived::virtual_function\n";
        }
        void non_virtual_function() {
            // not called
            std::cout << "Derived::non_virtual_function\n";
        }
    };
    
    int main() {
        Derived d;
        d.foo();
    }
    

    【讨论】:

      【解决方案4】:

      不知道你在问什么:

      class A
      {
        public:
          void method();
      };
      
      class B
      {
        public:
          void method();
      };
      
      class C : public A, public B
      {
        public:
          void callingMethod();
      };
      
      void C::callingMethod()
      {
        // Here you can just call A::method() or B::method() directly.
        A::method();
        B::method();
      }
      

      请注意,多重继承会导致非常难以解决的问题,我建议仅在必要时使用它。

      【讨论】:

      • 那么实现呢?对不起接口。
      • C++中没有interfaces这样的东西。但是,您可以拥有多重继承,但通常必须非常小心。
      【解决方案5】:

      如前所述,

      C++ 是否可以让一个类扩展一个类并实现另一个类?

      没有多大意义。答案只是“是”。您可以从任意数量的类派生:C++ 完全支持多重继承。

      因此,鉴于所述问题没有真正意义,您至少有可能打算

      C++ 是否可以让一个类扩展一个类,从而实现另一个类?

      这个问题的答案也是肯定的,但也不是微不足道的。它涉及虚拟继承。这很棘手。

      这是一个例子:

      #include <iostream>
      
      void say( char const s[] ) { std::cout << s << std::endl; }
      
      class TalkerInterface
      {
      public:
          virtual void saySomething() const = 0;
      };
      
      class TalkerImpl
          : public virtual TalkerInterface
      {
      public:
          void saySomething() const
          {
              say( "TalkerImpl!" );
          }
      };
      
      class MyAbstractClass
          : public virtual TalkerInterface
      {
      public:
          void foo() const { saySomething(); }
      };
      
      class MyClass
          : public MyAbstractClass
          , public TalkerImpl
      {};
      
      int main()
      {
          MyClass().foo();
      }
      

      虚拟继承确保MyClass 实例中只有一个 类型为TalkerInterface 的子对象。这会产生一些反直觉的后果。一种是“在实现中继承”有效,另一种是基类子对象的构造发生在每个 MyClass 构造函数中,更普遍地发生在最派生类中。

      干杯,

      【讨论】:

        猜你喜欢
        • 2010-10-13
        • 2018-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-13
        • 2019-05-22
        • 1970-01-01
        • 2015-01-25
        相关资源
        最近更新 更多