小编Wiz*_*ann的帖子

纯虚拟类中的构造函数应该是"受保护的"还是"公共的"?

以下示例来自"Inside C++对象模型"一书

class Abstract_base {
public:
    virtual ~Abstract_base () = 0;
    virtual void interface () const = 0;
    virtual const char* mumble () const 
    {
        return _mumble;
    }
protected:
    char *_mumble;
};
Run Code Online (Sandbox Code Playgroud)

作者说如果我想初始化_mumble,那么应该实现纯虚基类的数据成员,一个"受保护的构造函数".

但为什么要保护?为什么"公共建设者"不适合这个班级?

谢谢你的回答,如果有一个例子,这将是完美的~~ :)

c++ oop inheritance constructor pure-virtual

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

为什么编译器(例如gcc)以这种方式处理派生类的内存布局?

这是我的cpp代码.

#include <iostream>
using namespace std;

class A {
public:
    int val;
    char a;
};

class B: public A {
public:
    char b;
};

class C: public B {
public:
    char c;
};

int main()
{
    cout << sizeof(A) << endl;
    cout << sizeof(B) << endl;
    cout << sizeof(C) << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

程序的输出(在gcc中)是:

8
12
12
Run Code Online (Sandbox Code Playgroud)

这个输出让我很困惑.

我知道对齐可能是sizeof(A)等于8的原因.(sizeof(int) + sizeof(char) + 3 bytes padding)

我还猜测sizeof(B)(sizeof(B) == sizeof(A) + sizeof(char) + 3 bytes padding)的扩展是为了避免重置发生时的重叠.(是对的吗?)

但我真的不知道为什么sizeof(B)等于sizeof(C). …

c++ gcc object-model

8
推荐指数
1
解决办法
359
查看次数

为什么显式初始化列表更容易失败?

"Inside the C++ object model"一书中,作者说:

显式初始化列表有三个缺点:

  1. 只有当所有班级成员都是公开的时候才能使用它.

  2. 它只能指定常量表达式(能够在编译时进行评估的表达式).

3.因为它不是由编译器自动应用的,所以初始化对象失败的可能性显着提高.

我不知道为什么显式初始化列表更容易失败."编译器自动应用"的含义是什么?

是否有一些例子来证明这一观点.

感谢您的回答.

c++

7
推荐指数
1
解决办法
176
查看次数

C和C++编译器如何实现浮点数相等的决策?

例如,

float a = 1.0;
float b = 1.2;

puts(a == b? "equal": "not equal");
Run Code Online (Sandbox Code Playgroud)

编译器是按位还是通过其他方法处理它?

(我知道通过"=="来确定浮点数的相等性不是一个好的选择,我只是想知道编译器如何处理这种情况.)

c c++ floating-point-precision

7
推荐指数
1
解决办法
439
查看次数