nit*_*ian 5 c++ overriding base-class derived-class
我相信,一个derived class可以override只对那些从继承的功能base class.我的理解是否正确?
也就是说,如果基类具有公共成员函数func,那么派生类可以override是成员函数func.
但是如果基类有私有成员函数说foo,那么派生类不能覆盖成员函数foo.
我对吗?
在研究了SO成员给出的答案后,我想出了一个代码示例.我提到我在代码中作为评论研究的要点.希望我是对的.谢谢
/* Points to ponder:
1. Irrespective of the access specifier, the member functions can be override in base class.
But we cannot directly access the overriden function. It has to be invoked using a public
member function of base class.
2. A base class pointer holding the derived class obj's address can access only those members which
the derived class inherited from the base class. */
#include <iostream>
using namespace std;
class base
{
private:
virtual void do_op()
{
cout << "This is do_op() in base which is pvt\n";
}
public:
void op()
{
do_op();
}
};
class derived: public base
{
public:
void do_op()
{
cout << "This is do_op() in derived class\n";
}
};
int main()
{
base *bptr;
derived d;
bptr = &d;
bptr->op(); /* Invoking the overriden do_op() of derived class through the public
function op() of base class */
//bptr->do_op(); /* Error. bptr trying to access a member function which derived class
did not inherit from base class */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
fre*_*low 10
但是如果基类有私有成员函数说
foo,那么派生类不能覆盖成员函数foo.
在Java中,你不能.在C++中,你可以.
您是正确的,要重写派生类中的函数,它必须从基类继承它(此外,基类函数必须是虚拟的)。但是,您关于虚拟函数不被继承的假设是错误的。例如,以下内容效果很好(实际上是前置条件/后置条件检查的已知习惯用法):
class Base
{
public:
void operate_on(some thing);
private:
virtual void do_operate_on(some thing) = 0;
};
void Base::operate_on(some thing)
{
// check preconditions
do_operate_on(thing);
// check postconditions
}
class Derived: public Base
{
// this overrides Base::do_operate_on
void do_operate_on(some thing);
};
void Derived::do_operate_on(some thing)
{
// do something
}
int main()
{
some thing;
Base* p = new Derived;
// this calls Base::operate_on, which in turn calls the overridden
// Derived::do_operate_on, not Base::do_operate_on (which doesn't have an
// implementation anyway)
p->operate_on(thing);
delete p;
}
Run Code Online (Sandbox Code Playgroud)
查看私有方法是否真正被继承的一种方法是查看以下代码生成的错误消息:
class Base
{
private:
void private_method_of_B();
};
class Derived:
public Base
{
};
int main()
{
Derived d;
d.private_method_of_B();
d.method_that_does_not_exist();
}
Run Code Online (Sandbox Code Playgroud)
尝试使用 g++ 编译它会导致以下错误消息:
privatemethodinheritance.cc: In function 'int main()':
privatemethodinheritance.cc:4: error: 'void Base::private_method_of_B()' is private
privatemethodinheritance.cc:15: error: within this context
privatemethodinheritance.cc:16: error: 'class Derived' has no member named 'method_that_does_not_exist'
Run Code Online (Sandbox Code Playgroud)
如果 Derived 类不继承该函数,则两种情况下的错误消息将相同。