【问题标题】:How pointers of base class are used to form derived class object?基类的指针如何用于形成派生类对象?
【发布时间】:2020-07-21 09:43:09
【问题描述】:

我的测验中有这个问题。能解释一下吗?

指向基类的指针可以用派生的地址初始化 上课,因为______。

正确答案是“指针从派生到基的隐式转换”。

我有一些与此代码相关的问题:

#include <iostream>
using namespace std;

class Base
{
    protected:
    int x;
    public:
    Base(){};
    Base(int x1): x(x1) {};
    void show()
    {
        cout<<"x = "<<x<<endl;
    }
    virtual void printData()
    {
        cout<<"x = "<<x<<endl;
    }

};

class Derived: public Base
{
    int y;
    public:
    Derived(){};
    Derived(int x1, int y1): Base(x1), y(y1) {};
    void showXY()
    {
        cout<<"x = "<<x<<endl;
        cout<<"y = "<<y<<endl;
    }
    void printData()
    {
        cout<<"x = "<<x<<endl;
        cout<<"y = "<<y<<endl;
    }
    
    
};

int main()
{
    Base *d1 = new Derived(1,2);
    // d1->showXY(); gives error in running a derived class function
    d1->show();  // runs a base class function
    d1-> printData(); // runs a virtual (overriden) derived class function
    d1->~Base();  // uses a base class destructor

}

请解释一下这个概念。它是基类对象还是派生类对象?因为它运行基类函数,但是如果有覆盖,那么它会运行派生类函数,但在运行纯派生类函数时会出错。

【问题讨论】:

  • 你应该阅读虚函数和多态性
  • d1-&gt;~Base(); // uses a base class destructor -- 不要那样做。缺少的是基类的析构函数不是virtual。你应该在Base 中有一个虚拟析构函数,那行代码应该是delete d1;
  • @PaulMcKenzie 好的,但它是基类对象还是派生类对象?

标签: c++ class object pointers c++17


【解决方案1】:

是基类对象还是派生类对象

派生类对象是动态创建的。那是对象的动态类型。派生对象包含一个基础子对象。 d1 指向基础子对象。那就是指针的静态类型。

d1->~Base();

这很糟糕有两个原因:

  • 行为未定义,因为析构函数是非虚拟的
  • 内存泄漏。此处不应显式调用析构函数,而应使用 delete(如果析构函数是虚拟的)。

【讨论】:

  • 你能告诉我为了理解这个主题我应该学习哪些主题,因为我认为我缺少一些概念吗?
  • @FarzeenZehra 面向对象编程、C++、类、继承
  • 你说调用析构函数不好,但为什么程序没有隐式调用它?当我们创建对象时,编译器会调用析构函数本身,但在这种情况下它不会调用它。为什么?
  • @FarzeenZehra why the program is not calling it implicitly? 因为动态创建的对象不会被隐式销毁。
【解决方案2】:

您创建了一个指向派生类对象的基类指针 *d1,因为 new 关键字将派生类对象的内存地址动态分配给基类指针 *d1。

Base *d1 = new Derived(1,2);

现在,当您使用指针调用类的成员函数时,它会使用早期绑定来调用它。因此,对于每个函数调用,都会调用基类成员函数。但虚函数 printData() 将使用后期绑定调用,派生类的重写 printData() 将被调用。

现在是析构函数调用,@eerorika 说得对。

【讨论】:

    猜你喜欢
    • 2014-06-16
    • 1970-01-01
    • 2021-07-02
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2016-11-28
    相关资源
    最近更新 更多