在派生类中声明的虚函数

vag*_*l13 1 c++ virtual-functions inlining

这里我在Derived类中声明了另一个虚函数.

#include <iostream>

using namespace std;

class A{
    string s;
    public:
    A(const string& name) : s(name){}
     virtual void f1(){cout << "f1 of base class" << endl;};
};

class B : public A{
    string p;
    public:
    B(const string& name) : A(name){}
    virtual void f2(){cout << "virtual function of derived class" << endl;}
    void f1(){cout << "f1 of derived class";}
};

int main() {
    A* arr[] = {new A("John"),new B("Bob")};
    arr[0]->f1();
    arr[1]->f1();
    arr[1]->f2();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

函数调用arr [1] - > f2()给出错误" '类A'没有名为'f2'的成员 ".我想知道为什么_vptr指向基类的VTABLE,即使B被上升到A.

另外我想知道,内联虚拟功能安全吗?

dir*_*tly 9

因为没有这样的构件.virtual函数从首先声明它们的类到所有派生类发生.他们不会冒泡.当编译器查看arr[ i ]->f2()它时,查找arr其类型的定义.arr有(静态)类型A.因此,编译器查找A合适定义的定义,f2但找不到任何定义.因此诊断.

virtual功能可以安全地内联.实际上,编译器隐式地内联了所有类内定义.所以,你A::f1已经内联了.