C++ 抽象类型初始化

Posted

技术标签:

【中文标题】C++ 抽象类型初始化【英文标题】:C++ Abstract type initialisation 【发布时间】:2011-01-16 23:27:26 【问题描述】:

我有一个类接口,它有纯虚方法。在另一个类中,我有一个继承自 Interface 并使其非抽象的嵌套类型。我使用接口作为类型并使用函数来初始化类型,但是我得到,由于抽象类型而无法编译。

界面:

struct Interface

   virtual void something() = 0;

实施:

class AnotherClass

    struct DeriveInterface : public Interface
    
        void something() 
    

    Interface interface() const
    
        DeriveInterface i;
        return i;
    

用法:

struct Usage : public AnotherClass

    void called()
    
        Interface i = interface(); //causes error
    

【问题讨论】:

【参考方案1】:

你使用抽象类作为指针和引用,所以你会这样做

class AnotherClass

    struct DeriveInterface : public Interface
    
        void something() 
    

    DeriveInterface m_intf;

    Interface &interface() const
    
        return m_intf;
    


struct Usage : public AnotherClass

    void called()
    
        Interface &i = interface();
    

加上几个分号就可以了。注意C++中只有指针和引用是多态的,所以即使Interface不是抽象的,代码也会因为所谓的切片不正确。

struct Base  virtual int f(); 
struct Der: public Base  
   int f(); // override
;

...
Der d;
Base b=d; // this object will only have B's behaviour, b.f() would not call Der::f

【讨论】:

【参考方案2】:

您需要在此处使用接口*。

【讨论】:

以上是关于C++ 抽象类型初始化的主要内容,如果未能解决你的问题,请参考以下文章

c语言里的一等公民是啥意思

xcode c++错误:分配抽象类类型'Grain'的对象

第52课 C++中的抽象类和接口

接受对抽象类的 const 引用的 C++ 构造函数无法初始化 std::map

如何使用抽象类型的 C++ 指针指向具体类?

类C++