C++ 犄角旮旯

memetao 于 2023-06-17 发布

神魔问题

我真是服了噢, C++面试现在怎么是这个样子的,问的都是一些”神魔”的问题。

构造函数可以调用虚函数么

可以, 但是没有意义。进入基类就是调用的基类函数, 进入子类就是子类的函数

析构函数可以调用虚函数么

可以, 同上。

多继承的”缩型”问题

多继承的虚函数表

有意义的问题

volatile 真正的作用

https://zhuanlan.zhihu.com/p/33074506

多继承

地址的关系:

class A {
public:
    int a = 0x01;
};

class B {
public:
    int b = 0x02;
};

class C : public A, public B {
public:
    int c = 0x03;
};

C c;
A* p_a = &c;    // p_a 指向起始地址
B* p_b = &c;    // p_b 指向p_a + sizoef(int)

A* pa = new C;
B* pb = new C;  // 地址所指向的内容是一样的

虚函数与虚函数表(重要):

左值和右值

不是很严谨的来说,左值指的是既能够出现在等号左边也能出现在等号右边的变量(或表达式),右值指的则是只能出现在等号右边的变量(或表达式)。举例来说我们定义的变量 a 就是一个左值,而malloc返回的就是一个右值。或者左值就是在程序中能够寻值的东西,右值就是一个具体的真实的值或者对象,没法取到它的地址的东西(不完全准确),因此没法对右值进行赋值,但是右值并非是不可修改的,比如自己定义的class, 可以通过它的成员函数来修改右值。

归纳一下就是: