如何禁止虚方法被继承

wgzymzx 2012-05-13 09:32:37
class A
{
public:
virtual int addA();
};

class B : public A
{
public:
virtual int addA();
};

class C: public B
{
public:
virtual int addA(); //希望无法使用此方法
};
就是在C类中,不能通过virtual的方式实现addA这个方法,请问如何实现?
...全文
118 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bsnry 2012-05-13
  • 打赏
  • 举报
回复
class Base
{
public:
void fun1(){}
private:
void fun2(){}
protected:
void fun3(){}
};


class Derived:public Base
{
public:
using Base::fun3;
private:
using Base::fun1;

};


大家看我的的代码, 484页说:派生类可以恢复继承成员的访问级别,但不能范文级别比基类中原来指定的更严格或宽松。


看到没有啊,fun1以前被我修改为了 private, public变成 private,是不是可以理解为:

级别更加严格了。。。。。 如此说来,这句话有问题,,显然不可能有问题的,

那么 作者所说的 “访问级别比基类中原来值得你给的更严格或宽松” 指的是什么意思啊??

youkuxiaobin 2012-05-13
  • 打赏
  • 举报
回复
除了virtual声明为私有的没有别的办法了吗
某大一菜鸟 2012-05-13
  • 打赏
  • 举报
回复
通过private或者protected继承,然后增加using声明恢复继承成员的访问级别...
详情请查阅《C++ Primer》第15章的15.2.5相关部分..
wsxxiaohao 2012-05-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

把虚函数申明为private
[/Quote]
++
W170532934 2012-05-13
  • 打赏
  • 举报
回复
把虚函数申明为private
biegaoshuwoya 2012-05-13
  • 打赏
  • 举报
回复
c是别人 的 他想怎么干就怎么干、、、、
bsnry 2012-05-13
  • 打赏
  • 举报
回复
基类的指针可以调用一个 派生类的 保护成员函数啊???????

动态绑定,虚函数一般是public,

我见过 静态绑定crtp的一个例子,提到过 如何调用一个类的私有成员或者保护成员函数的法子,

通过函数指针,

不知道你说的是不是与我说的是同一个法子呢???


http://topic.csdn.net/u/20120512/17/4f891605-f2d1-4958-ad1b-e404b9f456c0.html

这是我昨天发的帖子,欢饮高手去 指导,谢谢了啊





[Quote=引用 10 楼 的回复:]

这不是编译器的问题。
虚函数声明为保护或私有,只是为了防止直接调用。实际上这是一种常见的设计模式之一:
允许通过一致的父类类型指针或引用调用不同对象的虚函数,但又不允许其他指针调用。于是只设置父类的虚函数为公有(实际上常用纯虚函数),子类的对应虚函数全都是保护或私有的...
[/Quote]
unituniverse2 2012-05-13
  • 打赏
  • 举报
回复
这不是编译器的问题。
虚函数声明为保护或私有,只是为了防止直接调用。实际上这是一种常见的设计模式之一:
允许通过一致的父类类型指针或引用调用不同对象的虚函数,但又不允许其他指针调用。于是只设置父类的虚函数为公有(实际上常用纯虚函数),子类的对应虚函数全都是保护或私有的...
某大一菜鸟 2012-05-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
2010 确实过了,2010据说支持最新的 c++

怀疑 新版c++ 已经去掉这个语法了



引用 7 楼 的回复:

引用 6 楼 的回复:
C/C++ code
class Base
{
public:
void fun1(){}
private:
void fun2(){}
protected:
void fun3(){}
};


class ……
[/Quote]

嘛...好吧话说一般也用不上这个方法..
bsnry 2012-05-13
  • 打赏
  • 举报
回复
2010 确实过了,2010据说支持最新的 c++

怀疑 新版c++ 已经去掉这个语法了


[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:
C/C++ code
class Base
{
public:
void fun1(){}
private:
void fun2(){}
protected:
void fun3(){}
};


class Derived:public Base
{
public:
using Base::fun3;
private:
u……

……
[/Quote]
某大一菜鸟 2012-05-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
C/C++ code
class Base
{
public:
void fun1(){}
private:
void fun2(){}
protected:
void fun3(){}
};


class Derived:public Base
{
public:
using Base::fun3;
private:
u……
[/Quote]

“但不能范文级别比基类中原来指定的更严格或宽松。”
这句话可以理解为与基类成员的访问标号保持一致..

话说你的程序应该过不了编译..

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧