首页 > 试题广场 >

下列函数中,能声明为虚函数的是()?

[不定项选择题]

下列函数中,能声明为虚函数的是()?

  • 构造函数
  • 公有成员函数
  • 析构函数
  • 私有成员函数
推拉门
发表于 2017-08-17 14:38:50 回复(0)
声明虚函数不是为了派生类对基类成员函数的覆盖 既然无论哪种继承方式派生类都不能访问基类的私有成员 那么声明私有成员函数为虚函数还有必要么?
发表于 2018-03-15 09:53:26 回复(6)

什么样的函数不能声明为虚函数?

  1. 不能被继承的函数。
  2. 不能被重写的函数。

1)普通函数

普通函数不属于成员函数,是不能被继承的。普通函数只能被重载,不能被重写,因此声明为虚函数没有意义。因为编译器会在编译时绑定函数。

而多态体现在运行时绑定。通常通过基类指针指向子类对象实现多态。

2)友元函数

友元函数不属于类的成员函数,不能被继承。对于没有继承特性的函数没有虚函数的说法。

3)构造函数

首先说下什么是构造函数,构造函数是用来初始化对象的。假如子类可以继承基类构造函数,那么子类对象的构造将使用基类的构造函数,而基类构造函数并不知道子类的有什么成员,显然是不符合语义的。从另外一个角度来讲,多态是通过基类指针指向子类对象来实现多态的,在对象构造之前并没有对象产生,因此无法使用多态特性,这是矛盾的。因此构造函数不允许继承。

4)内联成员函数

我们需要知道内联函数就是为了在代码中直接展开,减少函数调用花费的代价。也就是说内联函数是在编译时展开的。而虚函数是为了实现多态,是在运行时绑定的。因此显然内联函数和多态的特性相违背。

5)静态成员函数

首先静态成员函数理论是可继承的。但是静态成员函数是编译时确定的,无法动态绑定,不支持多态,因此不能被重写,也就不能被声明为虚函数。
 

发表于 2020-09-24 22:14:11 回复(4)

虚函数依赖于虚函数表,而虚函数表依赖于构造函数初始化

发表于 2019-05-28 00:23:27 回复(1)
c++中不能声明为虚函数的有,普通函数,友元函数,构造函数,内联成员函数,静态成员函数
发表于 2020-03-06 20:19:28 回复(0)

在实现C++多态时,如果提供了接口,但只想让他重写虚函数行为,不想让用户自己去使用,可以这样实现,在基类中将虚函数(接口)定为私有,如下:
  1. #include <iostream>
  2. using namespace std;
  3. class Base
  4. {
  5. public:
  6. void Do(){this->print();}
  7. private:
  8. //设置为私有后,基类自己决定怎样去使用它
  9. virtual void print(){cout << "Base::print"<<endl;}
  10. };
  11. class Child : public Base
  12. {
  13. public:
  14. virtual void print(){cout << "Child::print" <<endl;}
  15. };
  16. int main()
  17. {
  18. Base *p = new Child;
  19. p->print();//这里会有编译错误
  20. delete p;
  21. return 0;
  22. }
把虚函数设置为私有和保护都是为了保护虚函数
发表于 2018-08-08 00:15:13 回复(1)
构造函数不能声明为虚函数是因为在执行构造函数时类对象还未完成建立过程,谈不上把函数与类对象的绑定。
发表于 2020-06-16 22:38:38 回复(0)
。。我以为不能声明的是。。。构造函数不能声明为虚函数 析构函数中不能抛出异常
发表于 2018-10-14 21:59:51 回复(1)
构造函数不能声明为虚函数,因为在调用构造函数时,对象还没有被完全构造,无法进行动态绑定

另外,析构函数需要在对象销毁时自动调用,因此通常将其声明为虚函数,以便在删除派生类对象时自动调用派生类的析构函数。

私有成员函数也不应该声明为虚函数,因为虚函数必须是公有成员函数,才能在派生类中被重写。
发表于 2023-10-31 09:31:21 回复(0)
注意:D选项,私有成员函数可以被声明为虚函数,但是不能在类外使用父类虚函数。
发表于 2023-11-07 20:53:28 回复(0)
D有可能大部分情况下没有意义,但是可以
发表于 2022-04-29 21:23:58 回复(0)
只有构造函数不行‘因为调用时不知道准确类型。
发表于 2021-03-10 19:41:00 回复(0)
这个考题,语法角度没问题,但这样的接口没用。而且,如果是纯虚的私有成员函数,这个类就没任何用处
发表于 2020-08-18 11:26:46 回复(0)
D选项为什么可以啊?基类的私有成员对派生类无论是哪种继承都是不可见的,那么把基类的私有函数声明为虚函数有什么意义呢?
发表于 2019-07-09 09:57:04 回复(0)
构造函数为什么不能声明为虚函数,我以为构造和析构会是一样的。
发表于 2019-06-10 17:43:19 回复(0)
构造函数不能声明为虚函数,析构函数不能抛出异常。
发表于 2019-03-05 15:36:44 回复(0)
看成不能……我想打死自己……
发表于 2018-12-25 21:11:39 回复(0)
虚函数的访问权限不是protected和public吗,为什么私有成员可以声明为虚函数?
发表于 2018-10-31 22:50:40 回复(1)