假设我有课程Foo并Bar设置如下:
class Foo
{
public:
int x;
virtual void printStuff()
{
std::cout << x << std::endl;
}
};
class Bar : public Foo
{
public:
int y;
void printStuff()
{
// I would like to call Foo.printStuff() here...
std::cout << y << std::endl;
}
};
Run Code Online (Sandbox Code Playgroud)
正如在代码中注释的那样,我希望能够调用我所覆盖的基类函数.在Java中有super.funcname()语法.这在C++中是否可行?
我正在尝试完成上一个问题中描述的相同内容:
但是,我真正的问题是:
如果f()是Base类中的构造函数怎么办?将调用哪个g()?我不知道我做错了,但在我的计划中,似乎是相反的.
从前一个问题中获取相同的变量,显示这样的代码
行为看起来像这样:
Class Base
{
Base(){g();};
virtual void g(){//Do some Base related code;}
};
Class Derived : public Base
{
Derived(){};
virtual void g(){//Do some Derived related code};
};
int main()
{
Derived newDerived;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
更新:
Thanx到Naveen.
他向我提供了一个页面,其中包含有关此主题的所有相关信息.
我会告诉你这里的链接:
parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.6
我很想听听您在操作过程中使用什么技术来验证对象的内部状态,从它自己的角度来看,只能因为内部状态不良或不变违规而失败.
我主要关注的是C++,因为在C#中官方和流行的方式是抛出一个异常,并在C++中有不只是一个单一的方式做到这一点(OK,不是真的在C#或者,我知道).
请注意,我不是在讨论函数参数验证,而是更像是类不变完整性检查.
例如,假设我们想要一个异步打印作业的Printer对象Queue.对于用户来说Printer,该操作只能成功,因为异步队列的结果会在另一时间到达.因此,没有相关的错误代码传达给调用者.
但是对于该Printer对象,如果内部状态不好,则该操作可能会失败,即类不变被破坏,这基本上意味着:一个错误.该条件不一定是Printer对象的用户感兴趣的.
就个人而言,我倾向于混合三种内部状态验证方式,我无法确定哪一个是最好的,如果有的话,哪一个绝对是最差的.我想听听你对这些问题的看法,以及你在这个问题上分享你自己的经验和想法.
我使用的第一种风格 - 以可控制的方式比损坏的数据更好地失败:
void Printer::Queue(const PrintJob& job)
{
// Validate the state in both release and debug builds.
// Never proceed with the queuing in a bad state.
if(!IsValidState())
{
throw InvalidOperationException();
}
// Continue with queuing, parameter checking, etc.
// Internal state is guaranteed to be good.
}
Run Code Online (Sandbox Code Playgroud)
我使用的第二种风格 - 比腐败数据更难以控制崩溃:
void Printer::Queue(const PrintJob& job)
{
// Validate the …Run Code Online (Sandbox Code Playgroud)