行政还要负责网站建设新媒体吗,巨量算数数据分析入口,wordpress怎么弹出需要输入,网站推广的目的有哪些文章目录 49、 简述一下什么是常函数#xff0c;有什么作用#xff1f;50、 说说什么是虚继承#xff0c;解决什么问题#xff0c;如何实现#xff1f;51、简述一下虚函数和纯虚函数#xff0c;以及实现原理#xff1f;52、说说纯虚函数能实例化吗#xff0c;为什么有什么作用50、 说说什么是虚继承解决什么问题如何实现51、简述一下虚函数和纯虚函数以及实现原理52、说说纯虚函数能实例化吗为什么派生类要实现吗为什么53、说说C中虚函数与纯虚函数的区别?54、说说 C 中什么是菱形继承问题如何解决55、请问构造函数中的能不能调用虚方法56、请问拷贝构造函数的参数是什么传递方式为什么57、如何理解抽象类58、什么是多态除了虚函数还有什么方式能实现多态59、简述一下虚析构函数什么作用60、说说什么是虚基类可否被实例化61、简述一下拷贝赋值和移动赋值62、仿函数了解吗有什么作用62、C 中哪些函数不能被声明为虚函数 49、 简述一下什么是常函数有什么作用
类的成员函数后面加 const表明这个函数不会对这个类对象的数据成员准确地说是非静态数据成员作任何改变。 在设计类的时候一个原则就是对于不改变数据成员的成员函数都要在后面加const而对于改变数据成员的成员函数不能加 const。所以 const 关键字对成员函数的行为作了更明确的限定有 const 修饰的成员函数指 const 放在函数参数表的后面而不是在函数前面或者参数表内只能读取数据成员不能改变数据成员 没有 const 修饰的成员函数对数据成员则是可读可写的。除此之外在类的成员函数后面加 const 还有什么好处呢那就是常量即 const对象可以调用 const成员函数而不能调用非const修饰的函数。正如非const类型的数据可以给const类型的变量赋值一样反之则不成立。
#includeiostream
using namespace std;
class CStu {
public:int a;CStu() {a 12;
}
void Show() const {
//a 13; //常函数不能修改数据成员cout a I am show() endl;}
};
int main() {CStu st;st.Show();system(pause);return 0;
}50、 说说什么是虚继承解决什么问题如何实现
虚继承是解决C多重继承问题的一种手段从不同途径继承来的同一基类会在子类中存在多份拷贝。这将存在两个问题
其一浪费存储空间第二存在二义性问题通常可以将派生类对象的地址赋值给基类对象实现的具体方式是将基类指针指向继承类继承类有基类的拷贝中的基类对象的地址但是多重继承可能存在一个基类的多份拷贝这就出现了二义性。虚继承可以解决多种继承前面提到的两个问题。
51、简述一下虚函数和纯虚函数以及实现原理
一虚函数
C中的虚函数的作用主要是实现了多态的机制。关于多态简而言之就是用父类型的指针指向其子类的实例然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”这是一种泛型技术。如果调用非虚函数则无论实际对象是什么类型都执行基类类型所定义的函数。非虚函数总是在编译时根据调用该函数的对象引用或指针的类型而确定。如果调用虚函数则直到运行时才能确定调用哪个函数运行的虚函数是引用所绑定或指针所指向的对象所属类型定义的版本。虚函数必须是基类的非静态成员函数。虚函数的作用是实现动态联编也就是在程序的运行阶段动态地选择合适的成员函数在定义了虚函数后可以在基类的派生类中对虚函数重新定义在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。以实现统一的接口不同定义过程。如果在派生类中没有对虚函数重新定义则它继承其基类的虚函数。
class Person{
public://虚函数virtual void GetName(){coutPersonName:xiaosiendl;};
};
class Student:public Person{
public:void GetName(){coutStudentName:xiaosiendl;};
};
int main(){
//指针Person *person new Student();
//基类调用子类的函数person-GetName();//StudentName:xiaosi
}虚函数Virtual Function是通过一张虚函数表Virtual Table来实现的。简称为V-Table。在 这个表中主是要一个类的虚函数的地址表这张表解决了继承、覆盖的问题保证其容真实反应实际的函数。这样在有虚函数的类的实例中这个表被分配在了这个实例的内存中所以当我们用父类的指针来操作一个子类的时候这张虚函数表就显得由为重要了它就像一个地图一样指明了实际所应该调用的函数。
二纯虚函数 纯虚函数是在基类中声明的虚函数它在基类中没有定义但要求任何派生类都要定义自己的实现的实现方法。 在基类中实现纯虚函数的方法是在函数原型后加“0” virtualvoid GetName() 0。在很多情 况下基类本身生成对象是不合情理的。例如动物作为一个基类可以派生出老虎、孔雀等子类但动物本身生成对象明显不合常理。为了解决上述问题将函数定义为纯虚函数则编译器要求在派生类中必须予以重写以实现多态性。 同时含有纯虚拟函数的类称为抽象类它不能生成对象。这样就很好地解决了上述两个问题。将函数定义为纯虚函数能够说明该函数为后代类型提供了可以覆盖的接口但是这个类中的函数绝不会调用。 声明了纯虚函数的类是一个抽象类。
所以用户不能创建类的实例只能创建它的派生类的实例。必须在继承类中重新声明函数不要后面的0否则该派生类也不能实例化而且它们在抽象类中往往没有定义。定义纯虚函数的目的在于使派生类仅仅只是继承函数的接口。纯虚函数的意义让所有的类对象主要是派生类对象都可以执行纯虚函数的动作但类无法为纯虚函数提供一个合理的缺省实现。所以类纯虚函数的声明就是在告诉子类的设计者“你必须提供一个纯虚函数的实现但我不知道你会怎样实现它”。
//抽象类
class Person{
public://纯虚函数virtual void GetName()0;
};
class Student:public Person{
public:Student(){
};
void GetName(){coutStudentName:xiaosiendl;};
};
int main(){Student student;
}52、说说纯虚函数能实例化吗为什么派生类要实现吗为什么
纯虚函数不可以实例化但是可以用其派生类实例化示例如下
class Base
{
public:
virtual void func() 0;
};
#includeiostream
using namespace std;
class Base {
public:virtual void func() 0;
};
class Derived :public Base
{
public:void func() override {cout 哈哈 endl;
}
};
int main() {Base *b new Derived();b-func();return 0;
}虚函数的原理采用 vtable。类中含有纯虚函数时其vtable 不完全有个空位。 即“纯虚函数在类的vftable表中对应的表项被赋值为0。也就是指向一个不存在的函数。由于编译器绝对不允许有调用一个不存在的函数的可能所以该类不能生成对象。在它的派生类中除非重写此函数否则也不能生成对象。”所以纯虚函数不能实例化。纯虚函数是在基类中声明的虚函数它要求任何派生类都要定义自己的实现方法以实现多态性。定义纯虚函数是为了实现一个接口用来规范派生类的行为也即规范继承这个类的程序员必须实现这个函数。派生类仅仅只是继承函数的接口。纯虚函数的意义在于让所有的类对象主要是派生类对象都可以执行纯虚函数的动作但基类无法为纯虚函数提供一个合理的缺省实现。所以类纯虚函数的声明就是在告诉子类的设计者“你必须提供一个纯虚函数的实现但我不知道你会怎样实现它”。
53、说说C中虚函数与纯虚函数的区别?
虚函数和纯虚函数可以定义在同一个类中含有纯虚函数的类被称为抽象类而只含有虚函数的类不能被称为抽象类。虚函数可以被直接使用也可以被子类重载以后以多态的形式调用而纯虚函数必须在子类中实现该函数才可以使用因为纯虚函数在基类有声明而没有定义。虚函数和纯虚函数都可以在子类中被重载以多态的形式被调用。虚函数和纯虚函数通常存在于抽象基类之中被继承的子类重载目的是提供一个统一的接口。虚函数的定义形式 virtual{} ;纯虚函数的定义形式 virtual { } 0 ;在虚函数和纯虚函数 的定义中不能有static标识符原因很简单被static修饰的函数在编译时要求前期绑定,然而虚函数却是动态绑定而且被两者修饰的函数生命周期也不一样。
54、说说 C 中什么是菱形继承问题如何解决
导致问题菱形继承会导致数据重复和产生歧义 解决办法使用虚继承可确保每份数据自继承一次
55、请问构造函数中的能不能调用虚方法
不要在构造函数中调用虚方法从语法上讲调用完全没有问题但是从效果上看往往不能达到需要的目的。派生类对象构造期间进入基类的构造函数时对象类型变成了基类类型而不是派生类类型。同样进入基类析构函数时对象也是基类类型。 所以虚函数始终仅仅调用基类的虚函数如果是基类调用虚函数不能达到多态的效果所以放在构造函数中是没有意义的而且往往不能达到本来想要的效果。
56、请问拷贝构造函数的参数是什么传递方式为什么
拷贝构造函数的参数必须使用引用传递如果拷贝构造函数中的参数不是一个引用即形如CClass(const CClass c_class)那么就相当于采用了传值的方式(pass-by-value)而传值的方式会调用该类的拷贝构造函数从而造成无穷递归地调用拷贝构造函数。因此拷贝构造函数的参数必须是一个引用。需要澄清的是传指针其实也是传值如果上面的拷贝构造函数写成CClass(const CClass*c_class)也是不行的。事实上只有传引用不是传值外其他所有的传递方式都是传值。
57、如何理解抽象类
抽象类的定义如下 纯虚函数是在基类中声明的虚函数它在基类中没有定义但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“0”有虚函数的类就叫做抽象类。抽象类有如下几个特点 1抽象类只能用作其他类的基类不能建立抽象类对象。 2抽象类不能用作参数类型、函数返回类型或显式转换的类型。 3可以定义指向抽象类的指针和引用此指针可以指向它的派生类进而实现多态性。
58、什么是多态除了虚函数还有什么方式能实现多态
多态是面向对象的重要特性之一它是一种行为的封装就是不同对象对同一行为会有不同的状态。(举例 : 学生和成人都去买票时,学生会打折,成人不会)多态是以封装和继承为基础的。在C中多态分为静态多态早绑定和动态多态晚绑定两种其中动态多态是通过虚函数实现静态多态通过函数重载实现代码如下
59、简述一下虚析构函数什么作用
虚析构函数是将基类的析构函数声明为virtual举例如下
class TimeKeeper {public:TimeKeeper() {}virtual ~TimeKeeper() {}
};虚析构函数的主要作用是防止内存泄露。
定义一个基类的指针p在delete p时如果基类的析构函数是虚函数这时只会看p所赋值的对 象如果p赋值的对象是派生类的对象就会调用派生类的析构函数毫无疑问在这之前也会先 调用基类的构造函数在调用派生类的构造函数然后调用派生类的析构函数基类的析构函数所谓先构造的后释放如果p赋值的对象是基类的对象就会调用基类的析构函数这样就不会造成内存泄露。 如果基类的析构函数不是虚函数在delete p时调用析构函数时只会看指针的数据类型而不会去看赋值的对象这样就会造成内存泄露。
60、说说什么是虚基类可否被实例化
在被继承的类前面加上virtual关键字这时被继承的类称为虚基类代码如下:
class A
class B1:public virtual A;
class B2:public virtual A;
class D:public B1,public B2;虚继承的类可以被实例化举例如下
61、简述一下拷贝赋值和移动赋值
拷贝赋值是通过拷贝构造函数来赋值在创建对象时使用同一类中之前创建的对象来初始化新创 建的对象。移动赋值是通过移动构造函数来赋值二者的主要区别在于 1拷贝构造函数的形参是一个左值引用而移动构造函数的形参是一个右值引用 2拷贝构造函数完成的是整个对象或变量的拷贝而移动构造函数是生成一个指针指向源对象或 变量的地址接管源对象的内存相对于大量数据的拷贝节省时间和内存空间。
62、仿函数了解吗有什么作用
仿函数functor又称为函数对象function object是一个能行使函数功能的类。仿函数的语 法几乎和我们普通的函数调用一样不过作为仿函数的类都必须重载operator()运算符举个例 子
class Func{
public:void operator() (const string str) const {coutstrendl;}
};Func myFunc;myFunc(helloworld!);
helloworld!62、C 中哪些函数不能被声明为虚函数
常见的不不能声明为虚函数的有普通函数非成员函数静态成员函数内联成员函数构造函数友元函数。
谁懂啊… 虚函数 虚析构函数 虚表指针 虚基类 纯虚函数 虚函数表 虚构造函数 虚继承 虚继承的类 你们虚氏家族太狠了