【问题标题】:C++ new keyword in inheritance with different types具有不同类型的继承中的 C++ 新关键字
【发布时间】:2022-01-14 09:41:37
【问题描述】:

我最近开始学习 OOP。如果这是一个菜鸟问题,请原谅我。我的问题是, 我认为 new 关键字仅用于相同的数据类型,例如:

char* p = new char; // OR
int* myArr = new int[i] //etc...

在研究继承和虚函数时,我遇到了这个问题:

#include <iostream>
using namespace std;
class Human {
public:
    virtual void className() {
        cout << "Human" << endl;
    }
};
class Asian : public Human {
public:
    void className() {
        cout << "Asian" << endl;
    }
};
int main() {
    Human* h1 = new Asian(); 
    h1->className();
}

在main函数中,我们用基类初始化指针,然后new关键字后面有派生类?这两种数据类型代表什么,我应该如何使用它们?

【问题讨论】:

  • 在 C++ 中,多态性是通过指针和引用完成的。通常是对基类的指针或引用,它实际上可以引用派生类对象。 virtual 成员函数使用对象的虚函数表分派(这是如何发生的,是编译器实现的细节,不能以任何可移植方式以编程方式访问)。
  • 在c++中,你可以创建一个抽象类(Human)。然后您创建了一个亚洲对象(新亚洲返回一个亚洲指针)。由于继承,您可以进行分配。

标签: c++ oop inheritance new-operator


【解决方案1】:

请注意,在您的情况下,Human 类是Asian可访问 类和

$11.2/5 states -

如果基类可访问,则可以将指向派生类的指针隐式转换为指向该基类的指针(4.10、4.11)。 [注意:因此类 X 的成员和朋友可以将 X* 隐式转换为指向 X 的私有或受保护的直接基类的指针。—结束注释]

根据上面引用的语句,你可以将一个指向派生类Asian的指针转换为一个指向基类Human的指针(这意味着从Asian*Human* ),这就是你写的时候所做的:

Human* h1 = new Asian(); 

在上面的语句中,在左侧我们有一个名为 h1 类型为 Human 的指针,而在右侧使用关键字 new 创建了一个类型为 Asian 的对象堆。但请注意,使用new 具有second 效果,即在堆上创建Asian 类型的对象之后,返回指向该对象的pointer。所以本质上, 在右侧,我们得到一个指向Asian(亚洲*)的指针。

现在正如我在答案开头已经解释(引用)的那样,您可以将指向 Asian 的指针转换为指向 Human 的指针,这就是这里发生的事情。

现在你写的时候:

h1->className();

您必须考虑 3 个重要的事实:

  1. className 是一个虚函数/方法
  2. h1 是一个指针
  3. Asian公开继承Human

根据virtual function documentation

虚函数是可以为其他派生类重新定义的成员函数,可以保证编译器会为对应的派生类对象调用重新定义的虚函数 strong>,即使您使用 指针 或引用对象的基类来调用该函数。

结果是在运行时调用了名为className的派生类函数,我们看到Asian打印在控制台上。

【讨论】:

    【解决方案2】:

    这就是使用 OOP 的优势。假设你有一家汽车厂,你正在生产轿车、掀背车等。它们都是汽车,所以它们有四个轮子、发动机等等。为了不多次拥有相同的数据,可以使用继承。父类和子类都可以相互转换,但您可以理解的一个示例是,假设您有一个修改汽车的类。由于我没有指定汽车的类型,它可以是轿车或掀背车,而不是拥有 2 个不同的功能,您可以拥有一个接受父对象(汽车)的功能。

    virtual 关键字指定函数的子版本应该运行而不是父版本。所以在你的例子中,因为我们正在制作一个Asian 对象,我们将调用className 的子(亚洲)版本。如果没有 virtual 关键字,则父版本将运行。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2021-10-13
    • 2021-09-21
    • 2018-04-19
    • 2018-11-23
    • 2014-02-27
    • 2020-05-17
    相关资源
    最近更新 更多