【发布时间】:2021-09-11 08:11:00
【问题描述】:
考虑以下代码:
#include <iostream>
#include<string>
using namespace std;
class Base
{
public:
virtual string print() const
{
return "This is Base class";
}
};
class Derived : public Base
{
public:
virtual string print() const
{
return "This is Derived class";
}
};
void describe(Base p)
{
cout << p.print() << endl;
}
int main()
{
Base b;
Derived d;
describe(b);
describe(d);
return 0;
}
在执行此代码时,它给出的输出为
This is Base class
This is Base class
我对这个程序有几个疑问:
-
Base类中的print函数是一个const成员函数,所以继承后,当我们试图覆盖Derived类中print的定义时,编译器为什么没有报错。
-
在这个程序中,我们如何将派生类对象 (d) 传递给需要数据类型 Base 参数的函数。
-
即使我们可以以某种方式将派生类对象传递给函数,为什么它会打印“这是基类”而不是“这是派生类”。
-
当我将派生类对象传递给函数 describe 时,是否会发生隐式类型转换?
如果有人能向我解释这段代码的工作原理,我将不胜感激。
【问题讨论】:
-
这能回答你的问题吗? What is object slicing?
-
当您
void describe(Base p)执行此操作时,您的所有派生对象都将切片到其基类。 -
@Johan 这个链接确实解释了一些事情,但它仍然无法阐明我们如何成功地覆盖派生类中的 const 成员函数
-
const函数并不意味着你不能覆盖它。它是函数签名的一部分。你可以在 constness 的基础上拥有多个同名的函数。 -
TL;DR:
void describe(const Base& p).
标签: c++ class oop inheritance