声明纯虚函数时,必须要virtual关键字么?

时间:2021-01-05 19:15:23
C++ primer(第四版)502页上纯虚函数的示例似乎没标virtual,是不是可以不要??

41 个解决方案

#1


这个,还真的不知道……
没那样干过……

请楼主自行用编译器验证一下^_^

#2


标了

#3


基类必须要,没有听说过基类虚函数可以省略virtual的,
派生类中可以省略,因为编译器可以从它基类中知道这是虚函数

#4


纯虚函数是在虚函数的基础上加 = 0;
如果基类的某个函数是虚函数,而派生类又有与基类同名的虚函数的话
应该就可以不用加了吧
以为基类如果是虚函数派生类也是虚函数,有加跟没有加virtual都一个样

#5


引用 3 楼 arong1234 的回复:
基类必须要,没有听说过基类虚函数可以省略virtual的,
派生类中可以省略,因为编译器可以从它基类中知道这是虚函数

看C++ primer(4th edition)上面502页这样写的(“在函数形参表后面写上=0表示纯虚函数”,没说必须要virtual啊,一直记的是要的,但看到这里疑惑了):
声明纯虚函数时,必须要virtual关键字么?

#6


这个函数纯虚函数,为了实现多态。
而由于是纯虚函数,所以是抽象类型的,不可以实例化。
后代继承之后,如果需要该函数,则要实现该函数。

#7


为什么不自己试试?写个测试代码5分钟内即可以验证了!
尽信书则不如无书,如果讨论任何问题得基础都是“xx书这么说了”而没有自己得思考和验证,这是非常不健康得学习方式
引用 5 楼 cacar 的回复:
引用 3 楼 arong1234 的回复:
基类必须要,没有听说过基类虚函数可以省略virtual的,
派生类中可以省略,因为编译器可以从它基类中知道这是虚函数

看C++ primer(4th edition)上面502页这样写的(“在函数形参表后面写上=0表示纯虚函数”,没说必须要virtual啊,一直记的是要的,但看到这里疑惑了):

#8


引用 7 楼 arong1234 的回复:
为什么不自己试试?写个测试代码5分钟内即可以验证了!
尽信书则不如无书,如果讨论任何问题得基础都是“xx书这么说了”而没有自己得思考和验证,这是非常不健康得学习方式
引用 5 楼 cacar 的回复:
引用 3 楼 arong1234 的回复:
基类必须要,没有听说过基类虚函数可以省略virtual的,
派生类中可以省略,因为编译器可以从它基类中知道这是虚函数

看C++ primer(4th edition)上面502页这样写的(“在函数形参表后面写上=0表示纯虚函数”,没说必须要virtual啊,一直记的是要的,但看到这里疑惑了):

手头机子没编译器啊......就是上来问问,给个准信就好...........大家搞得这么麻烦...........

#9


首先声明虚函数肯定要virtual

但基类已经有virtual关键字子类就可以省了

省不省和是否是纯虚函数无关。

#10


好吧,我手头有编译器

经验证,VC2008下,纯虚函数不能省略virtual,只加=0,会报错
class A
{
public:
void f()=0;
};

error C2253: “A::f”: 纯说明符或抽象重写说明符只允许在虚函数上使用

#11


class A
{
virtual void f() = 0;//不能省
};

class B : public A
{
void f() = 0;//能省
};

int main()
{

}

#12


省不省和是否是纯虚函数无关。

#13


基类显示声明了virtual的话,默认派生类都是虚函数

所以基类必须要显示声明,如果你有需求的话

#14


不同的编译器有不同的规则。。。。。。建议加上virtual,即使是子类override了你的虚函数,也建议加上virtual,就是为了明确。。。

#15


bm

#16


.

#17


引用 14 楼 lianshaohua 的回复:
不同的编译器有不同的规则。。。。。。建议加上virtual,即使是子类override了你的虚函数,也建议加上virtual,就是为了明确。。。

正解

#18


.......

#19


好东西,收藏了,谢谢楼主

#20


d

#21


拿走。

#22


纯虚有 =0的,带不带virtual 要看编译器了 

#23


d

#24


么偶看到不用virtual还是虚函数的用法,关注。

#25


#3

#26


不懂

#27


基类里的虚函数都要加virtual吧, 纯虚函数就是在虚函数后面加=0.

#28


要。

#29


引用 3 楼 arong1234 的回复:
基类必须要,没有听说过基类虚函数可以省略virtual的,
 派生类中可以省略,因为编译器可以从它基类中知道这是虚函数


楼主所说有情况我不知道对不对,不过我知道我所引用的这个所说的一定对。

#30


[Quote=引用 29 楼 hellodan 的回复:]
引用 3 楼 arong1234 的回复:
 基类必须要,没有听说过基类虚函数可以省略virtual的,
  派生类中可以省略,因为编译器可以从它基类中知道这是虚函数


 楼主所说有情况我不知道对不对,不过我知道我所引用的这个所说的一定对。
[/Quote

#31


个人建议还是加上为好,厚积薄发嘛,

#32


派生类书写上可以省去,如果其上层父类已经声明该函数为virtual的话.

实际生成的代码没有区别

#33


11楼正解,
gcc 4.5.0通过。

#34


引用 5 楼 cacar 的回复:
引用 3 楼 arong1234 的回复:
基类必须要,没有听说过基类虚函数可以省略virtual的,
派生类中可以省略,因为编译器可以从它基类中知道这是虚函数

看C++ primer(4th edition)上面502页这样写的(“在函数形参表后面写上=0表示纯虚函数”,没说必须要virtual啊,一直记的是要的,但看到这里疑惑了):


人家也没说不加可以啊。

#35


C++ primer(第四版)好难读懂啊 例子一点都不好

#36


基类必须要用virtual 关键字,但是派生类里可以不用!
class Base
{
    virtual void A();
}

class Derived : public Base
{
    (virtual) void A();//这里的virtual 可要可不要
}

#37


mark 学习中

#38


标上吧,明显,好理解。

#39


派生类可以省略

#40


该回复于2010-08-19 10:18:36被版主删除

#41


学习了 帮顶

#1


这个,还真的不知道……
没那样干过……

请楼主自行用编译器验证一下^_^

#2


标了

#3


基类必须要,没有听说过基类虚函数可以省略virtual的,
派生类中可以省略,因为编译器可以从它基类中知道这是虚函数

#4


纯虚函数是在虚函数的基础上加 = 0;
如果基类的某个函数是虚函数,而派生类又有与基类同名的虚函数的话
应该就可以不用加了吧
以为基类如果是虚函数派生类也是虚函数,有加跟没有加virtual都一个样

#5


引用 3 楼 arong1234 的回复:
基类必须要,没有听说过基类虚函数可以省略virtual的,
派生类中可以省略,因为编译器可以从它基类中知道这是虚函数

看C++ primer(4th edition)上面502页这样写的(“在函数形参表后面写上=0表示纯虚函数”,没说必须要virtual啊,一直记的是要的,但看到这里疑惑了):
声明纯虚函数时,必须要virtual关键字么?

#6


这个函数纯虚函数,为了实现多态。
而由于是纯虚函数,所以是抽象类型的,不可以实例化。
后代继承之后,如果需要该函数,则要实现该函数。

#7


为什么不自己试试?写个测试代码5分钟内即可以验证了!
尽信书则不如无书,如果讨论任何问题得基础都是“xx书这么说了”而没有自己得思考和验证,这是非常不健康得学习方式
引用 5 楼 cacar 的回复:
引用 3 楼 arong1234 的回复:
基类必须要,没有听说过基类虚函数可以省略virtual的,
派生类中可以省略,因为编译器可以从它基类中知道这是虚函数

看C++ primer(4th edition)上面502页这样写的(“在函数形参表后面写上=0表示纯虚函数”,没说必须要virtual啊,一直记的是要的,但看到这里疑惑了):

#8


引用 7 楼 arong1234 的回复:
为什么不自己试试?写个测试代码5分钟内即可以验证了!
尽信书则不如无书,如果讨论任何问题得基础都是“xx书这么说了”而没有自己得思考和验证,这是非常不健康得学习方式
引用 5 楼 cacar 的回复:
引用 3 楼 arong1234 的回复:
基类必须要,没有听说过基类虚函数可以省略virtual的,
派生类中可以省略,因为编译器可以从它基类中知道这是虚函数

看C++ primer(4th edition)上面502页这样写的(“在函数形参表后面写上=0表示纯虚函数”,没说必须要virtual啊,一直记的是要的,但看到这里疑惑了):

手头机子没编译器啊......就是上来问问,给个准信就好...........大家搞得这么麻烦...........

#9


首先声明虚函数肯定要virtual

但基类已经有virtual关键字子类就可以省了

省不省和是否是纯虚函数无关。

#10


好吧,我手头有编译器

经验证,VC2008下,纯虚函数不能省略virtual,只加=0,会报错
class A
{
public:
void f()=0;
};

error C2253: “A::f”: 纯说明符或抽象重写说明符只允许在虚函数上使用

#11


class A
{
virtual void f() = 0;//不能省
};

class B : public A
{
void f() = 0;//能省
};

int main()
{

}

#12


省不省和是否是纯虚函数无关。

#13


基类显示声明了virtual的话,默认派生类都是虚函数

所以基类必须要显示声明,如果你有需求的话

#14


不同的编译器有不同的规则。。。。。。建议加上virtual,即使是子类override了你的虚函数,也建议加上virtual,就是为了明确。。。

#15


bm

#16


.

#17


引用 14 楼 lianshaohua 的回复:
不同的编译器有不同的规则。。。。。。建议加上virtual,即使是子类override了你的虚函数,也建议加上virtual,就是为了明确。。。

正解

#18


.......

#19


好东西,收藏了,谢谢楼主

#20


d

#21


拿走。

#22


纯虚有 =0的,带不带virtual 要看编译器了 

#23


d

#24


么偶看到不用virtual还是虚函数的用法,关注。

#25


#3

#26


不懂

#27


基类里的虚函数都要加virtual吧, 纯虚函数就是在虚函数后面加=0.

#28


要。

#29


引用 3 楼 arong1234 的回复:
基类必须要,没有听说过基类虚函数可以省略virtual的,
 派生类中可以省略,因为编译器可以从它基类中知道这是虚函数


楼主所说有情况我不知道对不对,不过我知道我所引用的这个所说的一定对。

#30


[Quote=引用 29 楼 hellodan 的回复:]
引用 3 楼 arong1234 的回复:
 基类必须要,没有听说过基类虚函数可以省略virtual的,
  派生类中可以省略,因为编译器可以从它基类中知道这是虚函数


 楼主所说有情况我不知道对不对,不过我知道我所引用的这个所说的一定对。
[/Quote

#31


个人建议还是加上为好,厚积薄发嘛,

#32


派生类书写上可以省去,如果其上层父类已经声明该函数为virtual的话.

实际生成的代码没有区别

#33


11楼正解,
gcc 4.5.0通过。

#34


引用 5 楼 cacar 的回复:
引用 3 楼 arong1234 的回复:
基类必须要,没有听说过基类虚函数可以省略virtual的,
派生类中可以省略,因为编译器可以从它基类中知道这是虚函数

看C++ primer(4th edition)上面502页这样写的(“在函数形参表后面写上=0表示纯虚函数”,没说必须要virtual啊,一直记的是要的,但看到这里疑惑了):


人家也没说不加可以啊。

#35


C++ primer(第四版)好难读懂啊 例子一点都不好

#36


基类必须要用virtual 关键字,但是派生类里可以不用!
class Base
{
    virtual void A();
}

class Derived : public Base
{
    (virtual) void A();//这里的virtual 可要可不要
}

#37


mark 学习中

#38


标上吧,明显,好理解。

#39


派生类可以省略

#40


该回复于2010-08-19 10:18:36被版主删除

#41


学习了 帮顶