C++ 使用指向派生类型对象的基类类型指针

C++ 使用指向派生类型对象的基类类型指针,c++,inheritance,polymorphism,C++,Inheritance,Polymorphism,假设我们有以下代码: class Base { public: virtual void print() { cout << "I'm base" << endl; } }; class Derived : public Base { public: void print() override { cout << "I'm derived" &l

假设我们有以下代码:

class Base
{
public:
    virtual void print()
    {
        cout << "I'm base" << endl;
    }
};

class Derived : public Base
{
public:
    void print() override 
    {
        cout << "I'm derived" << endl;
    }
};

int main()
{
    Base* b = new Derived();
    b->print();
}

它是否仅在我们希望访问基类的字段和属性时使用,而对于虚拟函数,则使用派生类中被重写的字段和属性?

在您的特定代码中,使用第一个方法而不是第二个方法并没有真正的好处。但是,考虑当你有两个(或多个)派生类,并希望使用这些类中的一个实例的公共指针时,实际类型取决于一些(运行时)条件。这时,这种多态性显示了它的有用性

如下所示:

intmain()
{
基数*b;
标准::cout>选择;
开关(选择){
案例1:
b=新衍生的1();
打破
案例2:
b=新衍生的2();
打破
违约:
b=新的基础();
打破
}
b->print();
//…与多态实例有关的其他内容。。。
删除b;/…完成后不要忘记删除它!
返回0;
}

我将把提供
Derived1
Derived2
类的定义留作“读者的练习”。

在您的特定代码中,使用第一种方法而不是第二种方法没有真正的好处。但是,考虑当你有两个(或多个)派生类,并希望使用这些类中的一个实例的公共指针时,实际类型取决于一些(运行时)条件。这时,这种多态性显示了它的有用性

如下所示:

intmain()
{
基数*b;
标准::cout>选择;
开关(选择){
案例1:
b=新衍生的1();
打破
案例2:
b=新衍生的2();
打破
违约:
b=新的基础();
打破
}
b->print();
//…与多态实例有关的其他内容。。。
删除b;/…完成后不要忘记删除它!
返回0;
}

我将把提供
Derived1
Derived2
类的定义留作“读者的练习”。

别忘了在
Base
中添加一个
virtual
析构函数,然后调用
delete b当你使用完对象时。@RemyLebeau确实是-另一个“读者练习”。@RemyLebeau是的,我只是想让这个例子尽可能简单地指向我所问的特定问题。别忘了在
中添加一个
虚拟
析构函数,然后调用
删除b当您使用完对象时。@RemyLebeau确实是-另一个“读者练习”。@RemyLebeau true,我只是想让示例尽可能简单,以指向我所问的特定问题。
Derived* d = new Derived();