一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。

具体表现在:

派生类的对象可以隐含转换为基类对象。

公有继承表示派生类对象是基类对象的一种特殊类型

派生类对象可以被隐式转换为基类对象,这样你就可以把一个派生类对象传递给接受基类对象的函数,或者将其赋值给基类对象。

class Base {
public:
    void show() {
        std::cout << "Base class" << std::endl;
    }
};

class Derived : public Base {
public:
    void display() {
        std::cout << "Derived class" << std::endl;
    }
};

int main() {
    Derived d;  // 派生类对象
    Base b = d;  // 派生类对象隐式转换为基类对象
    b.show();  // 使用基类的成员
    // b.display();  // 错误,基类对象不能调用派生类的成员
    return 0;
}

派生类的对象可以初始化基类的引用。

int main() {
    Derived d;  // 派生类对象
    Base& b = d;  // 派生类对象初始化基类引用
    b.show();  // 使用基类成员
    // b.display();  // 错误,基类引用不能调用派生类的成员
    return 0;
}

通过基类的引用来操作派生类的对象

通过基类引用只能调用基类中定义的成员函数,不能直接访问派生类新增的成员

派生类的指针可以隐含转换为基类的指针

派生类的指针也可以隐式转换为基类的指针。这使得你可以通过基类指针来访问派生类对象,但同样只能访问基类的成员

int main() {
    Derived d;  // 派生类对象
    Base* b = &d;  // 派生类指针隐式转换为基类指针
    b->show();  // 使用基类的成员
    // b->display();  // 错误,基类指针不能调用派生类的成员
    return 0;
}

替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员

【只能访问基类中的成员,无法直接访问派生类新增的成员】

更多推荐