有什么方法可以让子类调用重载函数的时候,必须调用父类的函数

cc___999 2014-04-07 01:42:11

class A
{
public:
A(){};
~A(){};
virtual void fun(void){}
};

class B :
public A
{
public:
B();
~B();
virtual void fun(void){}
};

现在希望在调用B::fun的时候,必须能一起调用到A::fun,有什么方法么
...全文
409 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
cc___999 2014-04-09
  • 打赏
  • 举报
回复
引用 10 楼 ken_scott 的回复:
9L +1 模板模式 / NVI手法 【effective c++ ???】 接口定义成public的non-virtual函数, 在此函数中调用private的virtual函数,(还可以做一些你希望的工作:初始化、销毁、加锁保护等) 让派生类重写此virtual函数
如果这样的话,派生类中的虚函数还能具有父类虚函数的功能么?!!
cc___999 2014-04-09
  • 打赏
  • 举报
回复
引用 13 楼 u011707402 的回复:
你可以在B中设计一个对象A啊。然后再在B中用A的对象来调用A中的啊
如果我再B里面忘了调不还是没用
halleyzhang3 2014-04-08
  • 打赏
  • 举报
回复
这个需求没有道理,既然父类的实现总是需要被调用,那就不应该成为虚函数的一部分。应该这样:
class A
{
public:
	void fun(void) {  blabla(); _fun(); }
	virtual void _fun(void){}
};

class B :
	public A
{
public:
	B();
	~B();
	virtual void _fun(void){ blabla2(); }
};
cc___999 2014-04-08
  • 打赏
  • 举报
回复
引用 7 楼 xiaohuh421 的回复:
[quote=引用 5 楼 sx5486510 的回复:] 有这中方法么?有没调用父类虚函数就触发的断言?
没有这样的方法. 只有通过其它逻辑才能实现. 比如你的虚函数是在你的基类中使用, 但是给外部实现的. 比如有如下类; class Animal { BOOL m_flag; public: void PrintAnimalName() { const char *pName = GetAnimalName(); ASERT(TEXT("请先调用基类函数")&&m_flag==TRUE); printf(pName); } vitural const char *GetAnimalName() { m_flag = TRUE; } } 这样的话, 如果派生类未调用基类的GetAnimalName, 那么断言就会失败. 当然, 这样的代码是很有缺陷的, 很烂的. 虚函数一多, 那标记就多得无法接受了. 并且需要基类能控制调用过程. 如果有其它方法, 继续学习.[/quote]恩 你这也是个方法 学习了
xiaohuh421 2014-04-08
  • 打赏
  • 举报
回复
引用 5 楼 sx5486510 的回复:
有这中方法么?有没调用父类虚函数就触发的断言?
没有这样的方法. 只有通过其它逻辑才能实现. 比如你的虚函数是在你的基类中使用, 但是给外部实现的. 比如有如下类; class Animal { BOOL m_flag; public: void PrintAnimalName() { const char *pName = GetAnimalName(); ASERT(TEXT("请先调用基类函数")&&m_flag==TRUE); printf(pName); } vitural const char *GetAnimalName() { m_flag = TRUE; } } 这样的话, 如果派生类未调用基类的GetAnimalName, 那么断言就会失败. 当然, 这样的代码是很有缺陷的, 很烂的. 虚函数一多, 那标记就多得无法接受了. 并且需要基类能控制调用过程. 如果有其它方法, 继续学习.
  • 打赏
  • 举报
回复
引用 4 楼 sx5486510 的回复:
[quote=引用 1 楼 akirya 的回复:]
class B :
    public A
{
public:
    B();
    ~B();
    virtual void fun(void){ A::fun();}
};
这个意思?
是这么个意思,但是不想每次派生一个类都需要加A::fun,有时候会忘记[/quote] 没有
cc___999 2014-04-08
  • 打赏
  • 举报
回复
引用 3 楼 xiaohuh421 的回复:
这个似乎没找到方法可以实现. 在某些地方加些标记, 程序运行时发现没有调用基类的函数就断言失败.
有这中方法么?有没调用父类虚函数就触发的断言?
cc___999 2014-04-08
  • 打赏
  • 举报
回复
引用 1 楼 akirya 的回复:
class B :
    public A
{
public:
    B();
    ~B();
    virtual void fun(void){ A::fun();}
};
这个意思?
是这么个意思,但是不想每次派生一个类都需要加A::fun,有时候会忘记
xiaohuh421 2014-04-08
  • 打赏
  • 举报
回复
这个似乎没找到方法可以实现. 在某些地方加些标记, 程序运行时发现没有调用基类的函数就断言失败.
「已注销」 2014-04-08
  • 打赏
  • 举报
回复
引用 10 楼 ken_scott 的回复:
9L +1 模板模式 / NVI手法 【effective c++ ???】 接口定义成public的non-virtual函数, 在此函数中调用private的virtual函数,(还可以做一些你希望的工作:初始化、销毁、加锁保护等) 让派生类重写此virtual函数
++
坛子成长记 2014-04-08
  • 打赏
  • 举报
回复
你可以在B中设计一个对象A啊。然后再在B中用A的对象来调用A中的啊
iamnobody 2014-04-08
  • 打赏
  • 举报
回复
只有构造和析构函数必须调用到子类的,你可以利用这个写一个辅助类来实现你想要的功能.
cc___999 2014-04-08
  • 打赏
  • 举报
回复
引用 9 楼 halleyzhang3 的回复:
这个需求没有道理,既然父类的实现总是需要被调用,那就不应该成为虚函数的一部分。应该这样:
class A
{
public:
	void fun(void) {  blabla(); _fun(); }
	virtual void _fun(void){}
};

class B :
	public A
{
public:
	B();
	~B();
	virtual void _fun(void){ blabla2(); }
};
我的用意是想基类实现一部分功能,然后子类在父类的功能上再添加一些定制的功能
ken_scott 2014-04-08
  • 打赏
  • 举报
回复
9L +1 模板模式 / NVI手法 【effective c++ ???】 接口定义成public的non-virtual函数, 在此函数中调用private的virtual函数,(还可以做一些你希望的工作:初始化、销毁、加锁保护等) 让派生类重写此virtual函数
Morrisss_ 2014-04-07
  • 打赏
  • 举报
回复
在重载的函数里,用::限定符指明先调用基类函数。
  • 打赏
  • 举报
回复
class B :
    public A
{
public:
    B();
    ~B();
    virtual void fun(void){ A::fun();}
};
这个意思?

65,209

社区成员

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

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