c++虚函数(二)

news/2024/7/4 1:41:24 标签: c++, class, delete, c
cle class="tags" href="/tags/CLASS.html" title=class>class="baidu_pl">
cle_content" class="tags" href="/tags/CLASS.html" title=class>class="article_content clearfix">
content_views" class="tags" href="/tags/CLASS.html" title=class>class="htmledit_views">

二. 虚函数的语法
  虚函数的标志是“virtual”关键字。

2.1 使用virtual关键字
  考虑下面的类层次:

class="tags" href="/tags/CLASS.html" title=class>class A
{
public:
virtual void foo();
};

class="tags" href="/tags/CLASS.html" title=class>class B: public A
{
public:
void foo(); // 没有virtual关键字!
};

class="tags" href="/tags/CLASS.html" title=class>class C: public B // 从B继承࿰c;不是从A继承!
{
public:
void foo(); // 也没有virtual关键字!
};


  这种情况下࿰c;B::foo()是虚函数࿰c;C::foo()也同样是虚函数。因此࿰c;可以说࿰c;基类声明的虚函数࿰c;在派生类中也是虚函数࿰c;即使不再使用virtual关键字。

2.2 纯虚函数
  如下声明表示一个函数为纯虚函数:


class="tags" href="/tags/CLASS.html" title=class>class A
{
public:
virtual void foo()=0; // =0标志一个虚函数为纯虚函数
};


  一个函数声明为纯虚后࿰c;纯虚函数的意思是:我是一个抽象类!不要把我实例化!纯虚函数用来规范派生类的行为࿰c;实际上就是所谓的“接口”。它告诉使用者࿰c;我的派生类都会有这个函数。

2.3 虚析构函数
  析构函数也可以是虚的࿰c;甚至是纯虚的。例如:


class="tags" href="/tags/CLASS.html" title=class>class A
{
public:
virtual ~A()=0; // 纯虚析构函数
};

当一个类打算被用作其它类的基类时࿰c;它的析构函数必须是虚的。考虑下面的例子:

class="tags" href="/tags/CLASS.html" title=class>class A
{
public:
A() { ptra_ = new char[10];}
~A() { class="tags" href="/tags/DELETE.html" title=delete>delete[] ptra_;} // 非虚析构函数
private:
char * ptra_;
};

class="tags" href="/tags/CLASS.html" title=class>class B: public A
{
public:
B() { ptrb_ = new char[20];}
~B() { class="tags" href="/tags/DELETE.html" title=delete>delete[] ptrb_;}
private:
char * ptrb_;
};

void foo()
{
A * a = new B;
class="tags" href="/tags/DELETE.html" title=delete>delete a;
}


  在这个例子中࿰c;程序也许不会象你想象的那样运行࿰c;在执行class="tags" href="/tags/DELETE.html" title=delete>delete a的时候࿰c;实际上只有A::~A()被调用了࿰c;而B类的析构函数并没有被调用!这是否有点儿可怕?

  如果将上面A::~A()改为virtual࿰c;就可以保证B::~B()也在class="tags" href="/tags/DELETE.html" title=delete>delete a的时候被调用了。因此基类的析构函数都必须是virtual的。

  纯虚的析构函数并没有什么作用࿰c;是虚的就够了。通常只有在希望将一个类变成抽象类(不能实例化的类)࿰c;而这个类又没有合适的函数可以被纯虚化的时候࿰c;可以使用纯虚的析构函数来达到目的。

2.4 虚构造函数?
  构造函数不能是虚的。

 

本文来自CSDN博客࿰c;转载请标明出处:http://blog.csdn.net/dchcuckoo/archive/2005/10/14/503999.aspx

cle>

http://www.niftyadmin.cn/n/1737981.html

相关文章

tf.Keras.Model类常用方法总结

参考博主:(36条消息) tf.Keras.Model类总结_忆殇D.Rose的博客-CSDN博客

c++虚函数(一)

虚函数是C中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次&#xff1a; class A{public:virtual void foo() { cout << "A::foo() is called" << endl;}}; class B: public A{public:virtual …

TimeDistributed()层应用于自定义层出现NotImplementedError

当使用tensorflow.keras.layers中的TimeDistributed应用于自定义层在时间维度进行扩展时&#xff0c;使输入数据在时间维度上的每个数据应用于相同的自定义层&#xff08;或base_model&#xff09;&#xff0c;如&#xff1a; model Sequential() model.add(TimeDistributed(…

显示acc和lose时出现:KeyError: ‘sparse_categorical_accuracy‘

使用&#xff1a;historymodel.fit(训练集数据, 训练集标签, batch_size, epochs, validation_split用作测试数据的比例, validation_data测试集, validation_freq测试频率)训练之后&#xff0c;绘制其精度acc和损失loss函数曲线。 根据fit&#xff08;&#xff09;函数的传入…

C++虚函数(三)

三. 虚函数使用技巧 3.1 private的虚函数   考虑下面的例子&#xff1a; class A{public:void foo() { bar();}private:virtual void bar() { ...}}; class B: public A{private:virtual void bar() { ...}}; 在这个例子中&#xff0c;虽然bar()在A类中是private的&#…

TensorFlow2.X绘制常见图像(如AUC,acc,recall等等)

前人已写&#xff0c;所以不重复造轮子了&#xff0c;顾粘上相关链接&#xff1a; https://www.freesion.com/article/5668431209/#METRICS_7 解释一下代码中用到的color colors[0]&#xff0c;需要自定义相关颜色的列表&#xff0c;这里我们可以定义为&#xff1a; colors…

Keras中那些学习率衰减方法

(43条消息) Keras中那些学习率衰减策略_Siucaan-CSDN博客

常用脚本汇总

随机访问文件中的位置&#xff0c;但是需要保证不取到重复的数值 awk { print rand(),$1 } file.txt|sort -k1 |awk { print $2 } >result.txt awk { print rand(),$1 } file.txt在第一列加上随机数 awk { print rand(),$1 } file.txt|sort -k1按照第一列随机数排序 awk { p…