[原创] 将基类的private成员函数声明为虚函数的讨论

原创 2004年09月25日 05:16:00

有人认为“虚拟是用于多态 声明为private是没有什么意义了啊”,“private:可见域就是类本身,派生类是不可见的!”

开始我也这么想,可是在我做了实验以后,发现完全不是这么回事(代码环境vc6.0)

interface ITest
{
   private:
      virtual void test() = 0;
}

class ctest : public ITest

如果不在CTest中定义test成员函数,根本编译通不过

如果定义了,只是不能使用ITest::test的方法调用,使用CTest::test仍然是可以调用的

所以即使定义了private,仍然是可以在派生类中实现多态

那么是不是只有纯虚的函数才是这样呢?有做了以下的实验:

class ITest
{
public:
 void test2() {
  test();
 }
 private:
  virtual void test() {};
};

class ctest : public ITest

调用如下:
ITest * pTest = (ITest *)this;
pTest->test2();

如果你在CTest中实现了test函数,CTest::test仍然会被调用

可见子类虽然不能直接调用父类的private函数,却可以重载,并且可以修改函数的约束条件(从private改为public)。

有人问:“多态不是用'基类的指针或引用调用派生类的函数',既然无法通过 ITest 调用 CTest::test ,怎么叫做'在派生类中实现多态'?”

我觉得这是比较偏激的想法,比如上面的例子,test2中的某部分代码可以用test来实现,我可以使用派生类将test多态,编译器支持有什么不可以,只是多态只表现在类内而已。

最后多谢csdn.net的zhpzh (求新) 提出这个问题,不亲手实验真的想想不到,把回答的帖子整理大家参考

将基类的private成员函数声明为虚函数的讨论

http://blog.csdn.net/snaill/archive/2004/09/25/116287.aspx有人认为“虚拟是用于多态 声明为private是没有什么意义了啊”,“private...
  • oxware
  • oxware
  • 2004年09月25日 14:48
  • 1098

为啥继承时基类的析构一般声明为虚函数

1、为啥继承时基类的析构函数声明为虚函数? 文字描述太抽象了,直接用代码给出答案。 (1)第一段代码: #include using namespace std ; class Base {...
  • hj605635529
  • hj605635529
  • 2016年11月11日 21:28
  • 545

C++虚函数(9) - 虚函数能否为private?

C++中, 虚函数可以为private, 并且可以被子类覆盖。 例如,下面程序工作正常: #include class Derived; class Base { private...
  • shltsh
  • shltsh
  • 2015年05月26日 00:48
  • 1798

关于类的虚函数的public,private的继承问题。

下面的代码编译结果报错。 test.c: In function `int main(int, char**)': test.c:18:22: error: `virtual void TEST2::...
  • yifeng_1118
  • yifeng_1118
  • 2015年12月24日 15:02
  • 487

C++继承类和基类之间成员函数和虚函数调用机制

今天去参加百度的面试,遇到一个关于虚函数的机制的问题,我一直认为就是为了让基类指针或引用(指向继承类)能够看到基类的虚函数(当基类的虚函数没有被继承类重写),但是继承类又怎么看到基类的普通成员函数呢?...
  • wo17fang
  • wo17fang
  • 2014年05月05日 19:03
  • 1043

派生类可以访问基类的private成员吗

1.从派生类的使用者来讲, 所有的基类方法和成员都是private的,不可访问 2.从派生类内部来讲, 除了基类的private的方法和成员,其他的都可访问...
  • crazyhacking
  • crazyhacking
  • 2012年05月20日 21:42
  • 3127

个人银行账户管理程序4.0

改进内容 将Account类的show函数声明为虚函数,因此通过指向CreditAccount类实例的Account类型的指针来调用show函数时,被实际调用的是CreditAccount类定义的sh...
  • jingangxin666
  • jingangxin666
  • 2016年12月14日 20:33
  • 289

C++之成员函数声明为虚函数的规则

虚函数 定义: 虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,是C++多态的一种表现。 作用: 实现动态联编,也就是在程序的运行阶段动态地...
  • gaoruxue918
  • gaoruxue918
  • 2017年03月20日 00:15
  • 389

C++虚函数的陷阱--派生类对象的基类函数调用基类虚函数出错

最近写程序的时候发现,派生类对象的基类函数如果调用基类虚函数,则它将调用的是派生类的对应函数,而不是我想调用的基类的对应函数。 下面用一个例子来说明: //基类 class Base { public...
  • szlcw1
  • szlcw1
  • 2015年04月17日 10:40
  • 1487

虚函数在基类和子类中都存在时,调用情况分析

首先,给出基类animal和子类fish //============================================================== // ...
  • zhaowenqiang_120
  • zhaowenqiang_120
  • 2012年07月01日 17:07
  • 4381
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[原创] 将基类的private成员函数声明为虚函数的讨论
举报原因:
原因补充:

(最多只允许输入30个字)