c++;继承虚函数 我试图在C++中学习继承。我写了一些代码来学习虚拟函数 #include <iostream> using namespace std; class A { int a; public: A() {} virtual int get_count() const = 0; int get_A() { return a; } }; class B : public A{ public: int b; B() {} B(A& base) : b(base.get_count()) {} virtual int get_count() const { return 10; } }; void func(A& base) { B derived(base); cout << derived.b; } int main() { A base; B derived; func(derived); }

c++;继承虚函数 我试图在C++中学习继承。我写了一些代码来学习虚拟函数 #include <iostream> using namespace std; class A { int a; public: A() {} virtual int get_count() const = 0; int get_A() { return a; } }; class B : public A{ public: int b; B() {} B(A& base) : b(base.get_count()) {} virtual int get_count() const { return 10; } }; void func(A& base) { B derived(base); cout << derived.b; } int main() { A base; B derived; func(derived); },c++,inheritance,virtual,C++,Inheritance,Virtual,你能告诉我我做错了什么吗?你试图用一个基来实例化一个类型为A的对象。这是不可能的,因为包含纯虚函数。(get_count())假设我尝试调用base.get_count()您尝试用一个base实例化一个类型为A的对象。这是不可能的,因为包含纯虚函数。(get_count())假设我尝试调用base.get_count()方法virtual int get_count()const=0是纯虚拟的。您不能创建抽象类的对象(或者换句话说,具有纯虚拟成员)。如果要创建的对象,请删除=0和定义函数(如果需

你能告诉我我做错了什么吗?

你试图用
一个基来实例化一个类型为A的对象。这是不可能的,因为包含纯虚函数。(
get_count()
)假设我尝试调用
base.get_count()

您尝试用
一个base实例化一个类型为A的对象。这是不可能的,因为包含纯虚函数。(
get_count()
)假设我尝试调用
base.get_count()
方法
virtual int get_count()const=0是纯虚拟的。您不能创建抽象类的对象(或者换句话说,具有纯虚拟成员)。如果要创建的对象,请删除
=0
定义函数(如果需要,请使用空正文):


应该可以工作。

方法
虚拟整数get\u count()const=0是纯虚拟的。您不能创建抽象类的对象(或者换句话说,具有纯虚拟成员)。如果要创建的对象,请删除
=0
定义函数(如果需要,请使用空正文):


应该可以工作。

您实现
A
(如下)的方式使它成为一个抽象基类

class A 
{
  int a;

  public:
    A() {}
    virtual int get_count() const = 0; // this is a pure virtual function
    int get_A() { return a; }
};
它只能用作指向实现纯虚拟函数的派生类的指针:

int main() 
{
    B derived;
    A* pA = new B; // this is okay

    delete pA;
    return 0;
}

您实现
A
(如下)的方式使它成为一个抽象基类

class A 
{
  int a;

  public:
    A() {}
    virtual int get_count() const = 0; // this is a pure virtual function
    int get_A() { return a; }
};
它只能用作指向实现纯虚拟函数的派生类的指针:

int main() 
{
    B derived;
    A* pA = new B; // this is okay

    delete pA;
    return 0;
}

上面的答案是它不起作用的技术原因,但还有一个更隐秘的问题,那就是设计没有意义。您创建一个B是为了向a添加一些功能。如果您还创建了一个扩展a的C,您真的想将其转换为B吗

遗传的经典例子是动物。斑马和长颈鹿都是动物,所以类层次结构应该是这样的

class Animal 
{
    stuff
}

class Zebra : public Animal
{
    more stuff
}

class Giraffe : public Animal
{
    different stuff
}

尽管斑马和长颈鹿都是动物,但把它们变成长颈鹿并没有多大意义。

以上的答案是它不起作用的技术原因,但还有一个更隐蔽的问题,那就是设计没有意义。您创建一个B是为了向a添加一些功能。如果您还创建了一个扩展a的C,您真的想将其转换为B吗

遗传的经典例子是动物。斑马和长颈鹿都是动物,所以类层次结构应该是这样的

class Animal 
{
    stuff
}

class Zebra : public Animal
{
    more stuff
}

class Giraffe : public Animal
{
    different stuff
}

尽管斑马和长颈鹿都是动物,但把它们变成长颈鹿并没有多大意义。

这不是问题所在。他试图创建一个实例作为main的第一个变量,这是一个逻辑错误。应该是派生类的*或&and和实例。如果他创建实例是因为他想这样做呢?:)如果他愿意,他可以这样做。如果是这样,那就不应该是纯粹的虚拟。这是一个设计,它不应该是纯粹的虚拟。这就是我在回答中所说的。那么-出什么事了?:)这不是问题所在。他试图创建一个实例作为main的第一个变量,这是一个逻辑错误。应该是派生类的*或&and和实例。如果他创建实例是因为他想这样做呢?:)如果他愿意,他可以这样做。如果是这样,那就不应该是纯粹的虚拟。这是一个设计,它不应该是纯粹的虚拟。这就是我在回答中所说的。那么-出什么事了?:)