C++ VIRTUAL 关键词

黎 浩然/ 11 5 月, 2022/ C/C++, 计算机/COMPUTER/ 0 comments

多态

虚函数的调用取决于指向或者引用的对象的类型,而不是指针或者引用自身的类型。

默认参数

虚函数默认参数是静态绑定的。默认参数的使用需要看指针或者引用本身的类型,而不是对象的类型。

/**
 * @file first_example.cpp
 * @brief 虚函数中默认参数
 * 规则:虚函数默认参数是静态绑定的。默认参数的使用需要看指针或者应用本身的类型,而不是对象的类型!
 * @author Ernest
 * @version v1
 * @date 2019-07-24
 */
#include <iostream>
using namespace std;
class Base  {
public:
    virtual void fun ( int x = 10 ) {
        cout << "Base::fun(), x = " << x << endl;
    } 
};

class Derived : public Base {
public:
    virtual void fun ( int x=20 ) {
        cout << "Derived::fun(), x = " << x << endl;
    } 
};

int main() {
    Derived d1;
    Base *bp = &d1;
    bp->fun();
    return 0;
}
//10

Q&A

Q1)静态函数可以声明为虚函数吗?

A1)静态函数不可以声明为虚函数,同时也不能被const和volatile关键字修饰。static成员函数不属于任何类对象或类实例,所以即使给此函数加上virutal也是没有任何意义。

Q2)构造函数可以为虚函数吗?

A2)构造函数不可以声明为虚函数。同时除了inline和explicit之外,构造函数不允许使用其它任何关键字。我们之所以使用虚函数,是因为需要在信息不全的情况下进行多态运行。而构造函数是用来初始化实例的,实例的类型必须是明确的。因此,构造函数没有必要被声明为虚函数。

Q3)析构函数可以为虚函数吗?

A3)析构函数可以声明为虚函数。如果我们需要删除一个指向派生类的基类指针时,应该把析构函数声明为虚函数。事实上,只要一个类有可能会被其它类所继承,就应该声明虚析构函数(哪怕该析构函数不执行任何操作)。

Q4)虚函数可以声明为私有函数吗?

A4)

/**
 * @file virtual_function.cpp
 * @brief 虚函数可以被私有化,但有一些细节需要注意。
 * 基类指针指向继承类对象,则调用继承类对象的函数;
 * int main()必须声明为Base类的友元,否则编译失败。 编译器报错: ptr无法访问私有函数。
 * 当然,把基类声明为public, 继承类为private,该问题就不存在了。----> 见另外一个例子!
 * @author Ernest
 * @version v1
 * @date 2019-07-24
 */
#include<iostream>
using namespace std;

class Derived;

class Base {
private:
    virtual void fun() { cout << "Base Fun"; }
    friend int main();
};

class Derived: public Base {
public:
    void fun() { cout << "Derived Fun"; }
};

int main() {
    Base *ptr = new Derived;
    ptr->fun();
    return 0;
}
#include<iostream>
using namespace std;

class Derived;

class Base {
public:
    virtual void fun() { cout << "Base Fun"; }
    //friend int main();
};

class Derived: public Base {
private:
    void fun() { cout << "Derived Fun"; }
};

int main() {
    Base *ptr = new Derived;
    ptr->fun();
    return 0;
}

Q5)虚函数可以被内联吗?

A5)虚函数可以是内联函数,内联是可以修饰虚函数的,但是当虚函数表现多态性的时候不能内联。内联是在编译器建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码。

Share this Post

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注

*
*