相关疑难解决方法(0)

参数列表中间的默认参数?

我在代码中看到了一个函数声明,如下所示

void error(char const *msg, bool showKind = true, bool exit);
Run Code Online (Sandbox Code Playgroud)

我首先想到这是一个错误,因为你不能在函数中间有默认参数,但是编译器接受了这个声明.谁看过这个吗?我正在使用GCC4.5.这是GCC扩展吗?

奇怪的是,如果我把它放在一个单独的文件中并尝试编译,GCC会拒绝它.我已经仔细检查了所有内容,包括使用的编译器选项.

c++ default-arguments

52
推荐指数
2
解决办法
1万
查看次数

使用C++中的私有函数覆盖公共虚函数

是否有任何理由使重写的C++虚函数的权限与基类不同?这样做有危险吗?

例如:

class base {
    public:
        virtual int foo(double) = 0;
}

class child : public base {
    private:
        virtual int foo(double);
}
Run Code Online (Sandbox Code Playgroud)

C++常见问题解答说,这是一个坏主意,但没有说为什么.

我已经在一些代码中看到了这个习惯用法,我相信作者试图让这个类最终,基于一个假设,即不可能覆盖私有成员函数.但是,本文显示了重写私有函数的示例.当然,C++ faq的另一部分建议不要这样做.

我的具体问题:

  1. 在派生类和基类中使用不同的虚拟方法权限是否存在任何技术问题?

  2. 有没有合理的理由这样做?

c++ overriding virtual-functions access-control

47
推荐指数
3
解决办法
2万
查看次数

公共虚函数在C++中派生为private

我试图找出当派生类将虚拟函数声明为私有时会发生什么.以下是我写的程序

#include <iostream>
using namespace std;
class A
{
    public:
        virtual void func() {
        cout<<"A::func called"<<endl;
    }
    private:
};
class B:public A
{
    public:
    B()
    {
        cout<<"B constructor called"<<endl;
    }
    private:
    void func() {
        cout<<"B::func called"<<endl;
    }
};
int main()
{
    A *a = new B();
    a->func();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是(对我来说)输出是:

B constructor called
B::func called
Run Code Online (Sandbox Code Playgroud)

这不是违反该功能的私人访问集.这是预期的行为吗?这是标准的解决方法还是漏洞?通过VTABLE解析函数调用时是否绕过了访问级别?

对此行为的任何了解都会非常有帮助.

此外,有人提到私有覆盖虚拟成员会阻止进一步的类继承它.即使这有问题.修改上述程序包括:

class C: public B
{
    public:
    void func() {
        cout<<"C::func called"<<endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

以及主要的测试程序:

int main()
{
    A *a = new …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance virtual-functions

18
推荐指数
2
解决办法
7280
查看次数