class 是为此创建的实例,派生的 class 在这段代码中做了什么?

For which class is the instance created and what is the derived class doing in this code?

派生的 class 在这段代码中做了什么,例如:

class Base
{
public:
       virtual std::string Name(){ return "Base Class"}

};
class Derived : public Base
{
 public:
        std::string Name() {return "Derived Class"}
}

int main()
{
   Base* object = new Derived();
   return 0;
}

我正在学习教程,但不明白 Derived class 在 Base 的实例化中是什么 Class在上面的代码中做了。

修改 main 为:

int main()
{
   Base* object = new Derived();

   std::cout << object->Name() << std::endl;
   return 0;
}

并添加 3 个缺失的“;”在你的代码中,你会看到写 Derived Class,被调用的方法 Name 是 [= 的真实类型之一38=]object 是 Derived.

请注意,虽然 NameBase 中是 virtual,但它也在 Derived连你都没说清楚。

virtual 允许在应用方法时使用对象的 real 类型,因此即使 object 也是声明 BaseNamevirtual 被调用的版本是真实类型之一 派生


但是如果你在 NameBase 的定义中删除 virtual ,那么写 Base Class 因为 object 被声明 Base 调用的方法是 Name 定义的在 基地.

Derived 上添加 virtual 的结果是相同的,但仍然在 Base 上删除它,因为对于编译器object 被声明为 Base 并且 Name 不是 virtual Base 调用时不考虑object

的真实类型

所以,有:

#include <iostream>
#include <string>

class Base
{
  public:
    virtual std::string virtualName(){ return "Base Class";}
    std::string nonVirtualName(){ return "Base Class";}
};

class Derived : public Base
{
 public:
   std::string virtualName() {return "Derived Class";} // implicitely virtual
   std::string nonVirtualName(){ return "Base Class";}
};

int main()
{
   Base* object = new Derived();

   std::cout << object->virtualName() << std::endl;
   std::cout << object->nonVirtualName() << std::endl;

   return 0;
}

编译与执行:

bruno@bruno-XPS-8300:/tmp$ g++ -Wall a.cc
bruno@bruno-XPS-8300:/tmp$ ./a.out
Derived Class
Base Class
bruno@bruno-XPS-8300:/tmp$ 

请注意,如果您在 main 末尾添加 delete object;,并且由于默认析构函数不是 virtual,被调用的析构函数是 Base 完全适用于 nonVirtualName,而对于 Derived 什么都不做。在 Base 上定义析构函数 virtual 是正确的方法,这意味着析构函数至少是隐式的 virtualDerived 上允许在 delete object;

上执行两个析构函数

目标是实现 polymorphism,它是一个 OOP 概念,除其他外,它允许您使派生的 class 方法覆盖基础 class.

考虑以下几点:

class Base {
public:
    //virtual keyword allows method to be overriden
    virtual std::string Name() { return "Base Class"; }
    //virtual destructor needed for polymorphism otherwise it can lead to undefined behavior
    virtual ~Base(){} 
};

class Derived : public Base {
public:
    //optional keyword override signal the method has been overriden
    std::string Name() override { return "Derived Class"; }
};

class Derived2 : public Base {
public:
    std::string Name() override { return "Derived Class 2"; }
};

int main() {

    Base *object = new Derived();
    Base *object2 = new Derived2();
    Base *object3 = new Base();
    //collection of objects of type Base* which can hold any class of the family
    Base *collection[] = {object, object2, object3};

    for (auto &obj : collection) {//test print
        std::cout << obj->Name() << std::endl;
    }
}

正如评论所解释的那样,我可以拥有同一系列的不同对象的集合,当您调用 Name() 时,方法调用将取决于对象。

输出:

Derived Class
Derived Class 2
Base Class