在 C++ 中,父类不能直接调用子类的方法。这是因为父类并不知道它的子类有哪些方法,也不知道这些方法的实现细节。如果是通过父类指针指向子类对象来调用函数,那么调用的函数取决于该函数是否是虚函数。如果是虚函数,那么将调用子类中重写的虚函数;否则将调用父类中的函数。

然而,父类可以定义虚函数(virtual function),并在子类中重写这些虚函数。当父类的指针或引用指向一个子类对象时,通过这个指针或引用调用虚函数会调用子类中重写的版本。 下面是一个简单的示例:

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

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

int main() {
    Base* base = new Derived();
    base->foo(); // 输出 "Derived::foo()"
    delete base;
    return 0;
}

在这个例子中,Base 类定义了一个虚函数 fooDerived 类继承自 Base 类并重写了 foo 函数。在 main 函数中,我们创建了一个 Derived 类对象,并将其地址赋值给 Base 类指针 base。然后,通过 base 指针调用 foo 函数,实际上调用的是 Derived 类中重写的版本。

需要注意的是,只有当父类的指针或引用指向一个子类对象时,才能通过这种方式调用子类中重写的虚函数。如果父类的指针或引用指向一个父类对象,那么调用虚函数时仍然会调用父类中的版本。