C++ 当基类指针指向在基类中声明的派生类虚函数时,为什么会出现编译时错误?

C++ 当基类指针指向在基类中声明的派生类虚函数时,为什么会出现编译时错误?,c++,polymorphism,virtual-functions,static-typing,name-lookup,C++,Polymorphism,Virtual Functions,Static Typing,Name Lookup,我有一个基类,它具有虚void function1(),并且在派生类中被重写。此外,在我的派生类中还有一个虚拟函数,如下所示 class Base { public: virtual void function1() { cout<<"Base::Virtual function1"<<endl; } }; class Derived1:public Base { public: void function

我有一个基类,它具有虚void function1(),并且在派生类中被重写。此外,在我的派生类中还有一个虚拟函数,如下所示

class Base
{
    public:
    virtual void function1()
    {
        cout<<"Base::Virtual function1"<<endl;
    }

};
class Derived1:public Base
{
    public:
    void function1()
    {
        cout<<"Derived1::Function1"<<endl;
    }
    virtual void function2()
    {
        cout<<"Derived1::function2"<<endl;

    }
};
int main()
{       
    Base *bptr = new Derived1();
    Derived1 *dptr = new Derived2();
    bptr->function2(); //compile time error

    return 0;
}
类基
{
公众:
虚空函数1()
{

cout在基类
base
中,您没有虚拟的
function2
,因此如果将“base”用作类型编译器,则无法找到
function2

改为:

class Base
{
    public:
    virtual void function1()
    {
        cout<<"Base::Virtual function1"<<endl;
    }

    virtual void function2() = 0;

};
类基
{
公众:
虚空函数1()
{

cout在基类
base
中,您没有虚拟的
function2
,因此如果将“base”用作类型编译器,则无法找到
function2

改为:

class Base
{
    public:
    virtual void function1()
    {
        cout<<"Base::Virtual function1"<<endl;
    }

    virtual void function2() = 0;

};
类基
{
公众:
虚空函数1()
{

cout编译器不跟踪bptr的运行时类型,而是始终认为它指向Base的实例。您必须在Base中声明function2,编译器才能确认它。此外,派生类中的function1不应该像基类中的function1一样声明为virtual吗?

编译器不跟踪运行时类型e类型的bptr,并始终认为它指向Base的实例。您必须在Base中声明function2,编译器才能确认它。此外,派生类中的function1不应该声明为虚拟类吗?

您没有
Derived2
类这可能是具有静态类型的y编译语言您没有
Derived2
类这可能是任何具有静态类型的编译语言的行为本质上的重复
function 1
Derived
中是虚拟的,只是因为它在
Base
中是虚拟的。关键字是可选的,但为了清楚起见,它应该是虚拟的应该在那里。
Derived
中的
function1
是虚拟的,因为它在
Base
中是虚拟的。关键字是可选的,但为了清楚起见,它可能应该在那里。