定义在具有纯虚拟函数和正则函数的类中是必要的吗
Is definition necessary in classes that have pure virtual functions AND regular functions?
例如,如果您创建了一个具有一个纯虚拟函数但具有一个或多个非纯虚拟函数的类,您可以跳过创建实现文件,从而跳过类的定义吗?
如果有一个非虚拟函数,这是一样的吗?我猜不会…
您始终只能通过内联定义所有成员函数来使类成为头。这与函数是否为虚拟函数无关。此外,头文件几乎总是包含类定义(除非使用正向声明)。
澄清术语:
类别声明:
class C;
具有一个成员函数的类定义:
class C {
void f();
};
具有一个内联定义的成员函数的类定义:
class C {
void f() { ... }
};
这三种风格在不同的情况下都是可行和有用的。对于类模板,通常使用第三种样式来允许任意实例化。对于包含大量代码的普通类,第二种样式很流行,因为它减少了对象代码的大小和编译时间。
在不调用任何成员之前,您不需要有它们的声明,即使您的类不是抽象的。
这是一个很好的方法来禁止一些运算符-使它们成为私有的并且不声明,以确保这个运算符不会与这个类一起使用。
您不应该在基类中为纯虚拟函数创建定义,而应该为正则函数创建定义。在基类中定义纯虚拟方法没有任何意义。
此外,如果一个类是抽象类(即,如果它由纯虚拟函数组成),则必须继承它。此外,我们不能为抽象类创建对象
编辑部分:
class A{
public:
int a;
virtual void vDisplay() = 0; //Should not be defined in base class and must be defined in the derived class
virtual int vGet(); //non pure Virtual function
void vSetA(int x); //non virtual member function must be defined
};
class B:public A{
int b;
public:
void vDisplay(); //should be defined in derived class
int vGet();
void vSetB(int x,int y);
};
int A::vGet(){
return a;
}
void A::vSetA(int x){
a = x;
}
void B::vDisplay(){
cout<<"a="<<a<<"b="<<b;
}
int B::vGet(){
return a;
}
void B::vSetB(int x, int y){
a = x;
b = y;
}
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 如何在C++中伪造虚拟可变参数函数模板?
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 是否可以使用函数指针调用虚拟析构函数?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 虚拟继承基构造函数消除
- "虚拟""覆盖"析构函数
- 类中的虚拟布尔函数参数不起作用
- 用纯虚拟函数兜圈子
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- 尝试在 QLabel 上绘画失败(无法在没有对象的情况下调用成员函数"虚拟无效 QLabel::p aintEvent(QPaintEvent*)")
- 声明析构函数虚拟就足够了吗?
- 视觉 C++当我们在基类中使函数成为纯虚拟时,那么在子类中再次使相同的函数虚拟的必要性是什么
- 重载函数(虚拟/非虚拟)