【笔试题】【day14】
创始人
2024-01-17 19:34:19

目录

第一题(哪些成员变量需要在初始化列表初始化)

第二题(多态的条件)

第三题(多态的条件(通过父类对象调用的全部都是父类的方法))

第四题(菱形继承,虚拟继承的初始化顺序)


第一题(哪些成员变量需要在初始化列表初始化)

有一个类B继承自类A,他们数据成员如下:

class A {...
private:int a;
};
class B : public A {...
private:int a;
public:const int b;A &c;static const char* d;B* e;
}

则构造函数中,成员变量一定要通过初始化列表来初始化的是

A a b c
B b c e
C b c d e
D c e
E b d
F b c

哪些成员必须在初始化列表的位置初始化?

1.const修饰的成员变量(常量数据是不允许修改的,所以只能通过参数列表初始化)

2.引用类型的成员变量(引用不能为空,必须要引用一个对象)

3.类的类型对象,该类没有默认的构造函数。(比方说我们的B类中没有默认构造函数,有一个B(int x)的构造函数,那么我们的另外一个类A去调用我们这个类B的时候,就必须在初始化列表的位置初始化这个B)

A():B(30)
{}

同【笔试题】【day7】_桜キャンドル淵的博客-CSDN博客

中的第四题

但是这里的d也是const的呀,需不需要在参数列表的位置初始化?

静态成员不能再类的内部初始化!

因为静态的成员的初始化必须要放在类的外面,使用类访问限定符指明。

F

第二题(多态的条件)

class Base {
public:Base(int j): i(j) {}virtual~Base() {}void func1() {i *= 10;func2();}int getValue() {return i;}
protected:virtual void func2() {i++;}
protected:int i;
};
class Child: public Base {
public:Child(int j): Base(j) {}void func1() {i *= 100;func2();}
protected:void func2() {i += 2;}
};
int main() {Base * pb = new Child(1);pb->func1();cout << pb->getValue() << endl; delete pb;
}

A 11
B 101
C 12
D 102

这里我们的Base *pd=new Child(1)

会调用子类的Child的构造函数,

 在子类的构造的过程中,其初始化列表中会构造一个Base(j)

 这里的Base(j)又会初始化i为j,所以我们此时的i为1

然后pb->func1()

由于我们的pb是父类的指针,指向的是子类的对象,但是我们的fun1再Base前面并没有加上virtual,所以不构成多态!所以这里还是按照父类的指针就调用父类的方法

 此时我们的i*=10,变成了10,然后调用func2函数

但是我们观察到这个func2函数基类有virtual,并且这是一个父类指针,指向子类,满足多态的条件,所以这里构成多态,也就是调用子类的func2函数,也就是我们下面的这个func2(),所以我们的i+=2变成了12

 

C

第三题(多态的条件(通过父类对象调用的全部都是父类的方法))

#include
#include
using namespace std;
class B0 {
public:virtual void display() {cout << "B0::display0" << endl;}
};
class B1 :public B0 {
public:void display() { cout << "B1::display0" << endl; }
};
class D1 : public B1 {
public:void display() {cout << "D1::display0" << endl;}
};
void fun(B0 ptr) {ptr.display();
}
int main() {B0 b0;B1 b1;D1 d1;fun(b0);fun(b1);fun(d1);
}

A B0::display0 B0::display0 B0::display0
B B0::display0 B0::display0 D1::display0
C B0::display0 B1::display0 D1::display0
D B0::display0 B1::display0 B1::display0

这里我们观察到我们的fun()是一个全局函数

然后我们传入的对象都会被赋值给一个父类对象B0

然后再用这个父类对象去调用display()函数

这里不满足我们多态的条件,只是静态编译,所以我们输出的三个全部都是B0::display0

(对象的调用是静态编译!不是多态)

 

第四题(菱形继承,虚拟继承的初始化顺序)

#include
using namespace std;
class A {
public: A(const char* s) { cout << s << endl; } ~A() {}
};
class B : virtual public A {
public: B(const char* s1, const char* s2) :A(s1) { cout << s2 << endl; }
};
class C : virtual public A {
public: C(const char* s1, const char* s2) :A(s1) { cout << s2 << endl; }
};
class D : public B, public C {
public: D(const char* s1, const char* s2, const char* s3, const char* s4) :B(s1, s2), C(s1, s3), A(s1){ cout << s4 << endl; }
};
int main() { D* p = new D("class A", "class B", "class C", "class D"); delete p; return 0;
}

A class A
class B
class C
class D


B class D
class B
class C
class A


C class D
class C
class B

class A


D class A
class C
class B
class D

我们这里的初始化的顺序是按照这里继承的顺序来的,首先我们继承了B类

 但是我们的B类中又需要有一个A类,A类的构造又需要有一个字符串,所以上面的s1就是我们A类的构造函数中的字符串也就是classA最先被打印出来

然后构造B,打印classB

然后构造C,因为我们的C这里是虚拟继承的,并不会再去构造一个A,而是直接和B共用同一个A。打印classC 

最后打印构造D类,打印classD

A

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
怎么样消灭臭虫 臭虫用什么药消... 奔奔虫控|被吸血臭虫骚扰的滋味,你体会过吗?相信被臭虫骚扰过的人都不想再体验一次了吧?那么臭虫应该怎...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
苁蓉的食用方法 鲜苁蓉的吃法有... 肉苁蓉号称“温而不热,补而不峻,暖而不燥,滑而不泄,故有从容之名。”历来也是传统药食同源的滋补佳品。...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...