Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 容器类的成员可以';I don’我不是一个基类_C++_Base Class - Fatal编程技术网

C++ 容器类的成员可以';I don’我不是一个基类

C++ 容器类的成员可以';I don’我不是一个基类,c++,base-class,C++,Base Class,我有一个容器类,它处理它的成员。这个成员应该是一个派生类,因为它可以有几种类型。我想在这个容器类中编写与这个成员相同的代码,不管它是什么类型的派生类。然而,我甚至不能让它运行。它可以编译,但运行时错误是/bin/sh:./virtual\u member\u test:没有这样的文件或目录。下面是一些示例代码。为什么这样不行 #include <iostream> #include <string> class Base { public: Base();

我有一个容器类,它处理它的成员。这个成员应该是一个派生类,因为它可以有几种类型。我想在这个容器类中编写与这个成员相同的代码,不管它是什么类型的派生类。然而,我甚至不能让它运行。它可以编译,但运行时错误是
/bin/sh:./virtual\u member\u test:没有这样的文件或目录
。下面是一些示例代码。为什么这样不行

#include <iostream>
#include <string>

class Base
{
public:  
    Base();
    ~Base();
    virtual void foo(std::string s); // also tried making this pure virtual but doesn't compile
};

class Derived1 : public Base
{
public:
    Derived1();
    ~Derived1();
    void foo(std::string s) {std::cout << s << " 1" << std::endl;};
};

class Derived2 : public Base
{
public:
    Derived2();
    ~Derived2();
    void foo(std::string s) {std::cout << s << " 2" << std::endl;};
};

class Container
{
public:
    Base m_thing;
    Container(Base thing);
    ~Container();
};

Container::Container(Base thing) : m_thing(thing)
{
}

int main(int argc, char **argv)
{
    return 0;
}
#包括
#包括
阶级基础
{
公众:
Base();
~Base();
virtualvoidfoo(std::string s);//也尝试将此设置为纯虚拟,但未编译
};
类Derived1:公共基
{
公众:
Derived1();
~Derived1();

void foo(std::string s){std::cout您需要定义基类虚函数

virtualvoidfoo(std::strings){}


或者,如果您想使它成为一个
纯虚拟函数
您不能拥有基类的实例,那么通过执行
Base*m_thing;

或者您需要定义基类虚拟函数

virtualvoidfoo(std::strings){}


或者,如果您想使其成为一个
纯虚拟函数
,您不能拥有基类的实例,所以当您像这样离开原型时,通过执行
Base*m_thing;

使其保持基类的指针:

virtual void foo(std::string s);
方法未定义,因此链接器不满足要求

将原型更改为以下内容时:

virtual void foo(std::string s) = 0;
该方法是纯虚拟方法,编译器不允许创建
Base
实例,因此编译器很生气

相反,如果要使用多态性,则应持有指向
Base
指针,而不是实例:

class Container
{
public:
    std::shared_ptr<Base> m_thing;
    Container(std::shared_ptr<Base> thing) : m_thing(thing) {}
};

当您像这样离开原型时:

virtual void foo(std::string s);
方法未定义,因此链接器不满足要求

将原型更改为以下内容时:

virtual void foo(std::string s) = 0;
该方法是纯虚拟方法,编译器不允许创建
Base
实例,因此编译器很生气

相反,如果要使用多态性,则应持有指向
Base
指针,而不是实例:

class Container
{
public:
    std::shared_ptr<Base> m_thing;
    Container(std::shared_ptr<Base> thing) : m_thing(thing) {}
};

好的,酷,看起来我有一些东西要读。谢谢@DanielTrugman@Taylor)好的,酷,看起来我有一些东西要读。谢谢@DanielTrugman@Taylor,玩得开心:)