代码如下所示。
为什么p1->display((导致生成错误?
如何通过派生ptr调用display() const
?
#include <iostream>
using namespace std;
class Base
{
public:
virtual void display() const
{
std::cout << "Base display const!" << std::endl;
}
virtual ~Base(){}
};
class Derive: public Base
{
public:
virtual void display()
{
std::cout << "Derive display!"<< std::endl;
}
virtual ~Derive(){}
};
int main()
{
const Base *pb1 = new Derive();
pb1->display(); // Base display const!
Base *pb2 = new Derive();
pb2->display(); // Base display const!
const Derive *p1 = new Derive();
//p1->display(); // Build Error
Derive *p2 = new Derive();
p2->display(); // Derive display!
return 0;
}
Derive
中的非const
display()
隐藏了Base
中的const
display()
。
将此添加到Derive
中以引入:
using Base::display;
演示
请注意,您现在有两个virtual
重载,它们可能会被单独覆盖。
class Last : public Derive {
public:
void display() override { std::cout << "non-const overriddenn"; }
void display() const override { std::cout << "const overriddenn"; }
};
int main() {
Derive* l1 = new Last;
l1->display(); // prints non-const overridden
const Derive* l2 = new Last; // prints const overridden
l2->display();
}