unique函數_C++核心準則C.35:基類的析構函數必須滿足的條件

6a204b92a2ab167d1897c5d442d8af90.png

C.35: A base class destructor should be either public and virtual, or protected and nonvirtual

基類的析構函數要么是公開的虛函數,要么是保護的非虛函數

Reason(原因)

To prevent undefined behavior. If the destructor is public, then calling code can attempt to destroy a derived class object through a base class pointer, and the result is undefined if the base class's destructor is non-virtual. If the destructor is protected, then calling code cannot destroy through a base class pointer and the destructor does not need to be virtual; it does need to be protected, not private, so that derived destructors can invoke it. In general, the writer of a base class does not know the appropriate action to be done upon destruction.

為了避免無定義的行為。如果析構函數是公有的,那么調用側的代碼就會嘗試使用基類指針銷毀派生類的對象,在基類的析構函數為非虛函數時其結果時沒有定義的。如果析構函數時保護的,那么調用側代碼就無法通過基類類型指針銷毀派生類對象,這是析構函數就沒有必要一定是虛函數。析構函數是保護而不是私有的,這樣派生類的析構函數才能調用它。通常,基類的設計者不會知道在析構函數中應該執行什么樣的動作。

Discussion(討論)

See this in the Discussion section:參見討論章節:

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Sd-dtor.

Example, bad(反面示例)

struct Base { // BAD: implicitly has a public nonvirtual destructor
virtual void f();
};
struct D : Base {
string s {"a resource needing cleanup"};
~D() { /* ... do some cleanup ... */ }
// ...
};
void use()
{
unique_ptr p = make_unique();
// ...
} // p's destruction calls ~Base(), not ~D(), which leaks D::s and possibly more

Note(注意)

A virtual function defines an interface to derived classes that can be used without looking at the derived classes. If the interface allows destroying, it should be safe to do so.虛函數定義了派生類的接口,它可以在不關注派生類的情況下使用。如果接口允許對象,那么這個銷毀過程應該是安全的。

Note(注意)

A destructor must be nonprivate or it will prevent using the type:析構函數必須是非私有的,除了它不想被別人用。(這樣可以由類自己控制銷毀,譯者注)

class X {

~X(); // private destructor
// ...
};
void use()
{
X a; // error: cannot destroy
auto p = make_unique(); // error: cannot destroy
}

Exception(例外)

We can imagine one case where you could want a protected virtual destructor: When an object of a derived type (and only of such a type) should be allowed to destroy another object (not itself) through a pointer to base. We haven't seen such a case in practice, though.我們可以想象一種需要保護的虛函數析構函數的情況:當希望允許派生類的對象(只有這個類型)通過基類指針銷毀另外一個對象(不是它自己)時。但是我們還沒有在實際的開發中遇到這種情況。

Enforcement(實施建議)

  • A class with any virtual functions should have a destructor that is either public and virtual or else protected and nonvirtual.
  • 擁有虛函數的類的虛函數要么是公開的虛函數,要么是保護的非虛函數。

譯者注:擁有虛函數一般就意味著它有派生類。

原文鏈接:

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c35-a-base-class-destructor-should-be-either-public-and-virtual-or-protected-and-nonvirtual


覺得本文有幫助?請分享給更多人。

更多文章請關注微信公眾號【面向對象思考】!

面向對象開發,面向對象思考!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532036.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532036.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532036.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java jta 例子_Java事務處理全解析(八)——分布式事務入門例子(Spring+JTA+Atomikos+Hibernate+JMS)...

在本系列先前的文章中,我們主要講解了JDBC對本地事務的處理,本篇文章將講到一個分布式事務的例子。請通過以下方式下載github源代碼:本地事務和分布式事務的區別在于:本地事務只用于處理單一數據源事務(比如單個數據庫)&#xff0…

python連接redis哨兵_Python redis.sentinel方法代碼示例

本文整理匯總了Python中redis.sentinel方法的典型用法代碼示例。如果您正苦于以下問題:Python redis.sentinel方法的具體用法?Python redis.sentinel怎么用?Python redis.sentinel使用的例子?那么恭喜您, 這里精選的方法代碼示例或…

交換兩個數組 差最小 java_如何交換兩個等長整形數組使其數組和的差最小(C和java實現)...

1 importjava.util.Arrays;23 /**4 *5 *authorAdministrator6 *7 */8 public classTestUtil {9 private int[] arrysMin null;1011 private int[] arrysMax null;1213 private int matchNum 0;1415 private boolean hasMatched false;1617 /**18 * 返回數組的所有元素的總和…

python 判斷子序列_Leetcode練習(Python):第392題:判斷子序列:給定字符串 s 和 t ,判斷 s 是否為 t 的子序列。...

題目&#xff1a;判斷子序列&#xff1a;給定字符串 s 和 t &#xff0c;判斷 s 是否為 t 的子序列。你可以認為 s 和 t 中僅包含英文小寫字母。字符串 t 可能會很長(長度 ~ 500,000)&#xff0c;而 s 是個短字符串(長度 <100)。字符串的一個子序列是原始字符串刪除一些(也可…

垂直串聯六關節機器人調試手冊_工業機器人有哪些應用你知道嗎?

目前&#xff0c;工業機器人大部分集中于傳統的焊接、噴涂等領域&#xff0c;我國工業機器人的核心部件和整機市場仍被國外壟斷&#xff0c;工業機器人要面向整個智能制造市場&#xff0c;還需要具備應對整個智能制造過程中大多數工藝的能力&#xff0c;而工業互聯網則是實現智…

flume avro java 發送數據_flume將數據發送到kafka、hdfs、hive、http、netcat等模式的使用總結...

1、source為http模式&#xff0c;sink為logger模式&#xff0c;將數據在控制臺打印出來。conf配置文件如下&#xff1a;# Name the components on this agenta1.sources r1a1.sinks k1a1.channels c1# Describe/configure the sourcea1.sources.r1.type http #該設置表示接…

python三角函數擬合_使用python進行數據擬合最小化函數

這是我對這個問題的理解。首先&#xff0c;我通過以下代碼生成一些數據import numpy as npfrom scipy.integrate import quadfrom random import randomdef boxmuller(x0,sigma):u1random()u2random()llnp.sqrt(-2*np.log(u1))z0ll*np.cos(2*np.pi*u2)z1ll*np.cos(2*np.pi*u2)r…

java url 本地文件是否存在_我的應用程序知道URL中是否存在文件會一直停止[重復]...

這個問題在這里已有答案&#xff1a;我試圖寫一個應用程序&#xff0c;如果在給定的URL中有一個文件&#xff0c;將字符串放在textview中&#xff0c;這是代碼和崩潰信息&#xff0c;可能是什么錯誤&#xff1f;public class MainActivity extends AppCompatActivity {String u…

python枚舉類的意義_用于ORM目的的python枚舉類

編輯問題我正在嘗試創建一個類工廠,它可以生成具有以下屬性的枚舉類&#xff1a;>從列表中初始化類允許值(即,它)自動生成&#xff01;).> Class創建自己的一個實例對于每個允許的值.>類不允許創建任何其他實例一旦上述步驟已完成(任何嘗試這樣做會導致異常).>類實…

java 生成校驗驗證碼_java生成驗證碼并進行驗證

一實現思路使用BufferedImage用于在內存中存儲生成的驗證碼圖片使用Graphics來進行驗證碼圖片的繪制&#xff0c;并將繪制在圖片上的驗證碼存放到session中用于后續驗證最后通過ImageIO將生成的圖片進行輸出通過頁面提交的驗證碼和存放在session中的驗證碼對比來進行校驗二、生…

yy自動語音接待機器人_智能語音機器人落地產品有哪些?

據相關研究報告表明&#xff0c;在眾多人工智能落地產品或者應用場景中&#xff0c;智能語音機器人無論從產品的成熟度還是應用的廣泛度來說&#xff0c;都是人工智能行業最熱門和最有前景的產品。智能語音機器人并不只是一款產品&#xff0c;它是所有智能語音系列產品的統稱&a…

java資源文件獲取屬性_Java讀寫資源文件類Properties

Java中讀寫資源文件最重要的類是Properties1) 資源文件要求如下:1、properties文件是一個文本文件2、properties文件的語法有兩種&#xff0c;一種是注釋&#xff0c;一種屬性配置。注 釋&#xff1a;前面加上#號屬性配置&#xff1a;以“鍵值”的方式書寫一個屬性的配置信息…

java被放棄了_為什么學Java那么容易放棄?

學習Java確實很容易就放棄&#xff0c;但是也很容易就學好&#xff0c;因為大多數人都是抱著試一試的心態&#xff0c;然后當后面就堅持不下去但是回過頭來想一想&#xff0c;打游戲上分容易嗎&#xff0c;一樣是磕磕碰碰的&#xff0c;有時候十幾連跪都不會放棄你上分的心情。…

python 隱馬爾科夫_機器學習算法之——隱馬爾可夫(Hidden Markov ModelsHMM)原理及Python實現...

前言上星期寫了Kaggle競賽的詳細介紹及入門指導&#xff0c;但對于真正想要玩這個競賽的伙伴&#xff0c;機器學習中的相關算法是必不可少的&#xff0c;即使是你不想獲得名次和獎牌。那么&#xff0c;從本周開始&#xff0c;我將介紹在Kaggle比賽中的最基本的也是運用最廣的機…

java編程50_java經典50編程題(1-10)

1.有一對兔子從出生后第三個月起&#xff0c;每個月都生一對小兔子&#xff0c;小兔子長到三個月后每個月又生一對兔子&#xff0c;假設兔子不死亡&#xff0c;問每個月兔子的總數為多少&#xff1f;分析過程圖片發自簡書App示例代碼圖片發自簡書App運行結果圖片發自簡書App反思…

python替代hadoop_Python連接Hadoop數據中遇到的各種坑(匯總)

最近準備使用PythonHadoopPandas進行一些深度的分析與機器學習相關工作。(當然隨著學習過程的進展&#xff0c;現在準備使用PythonSparkHadoop這樣一套體系來搭建后續的工作環境)&#xff0c;當然這是后話。但是這項工作首要條件就是將Python與Hadoop進行打通&#xff0c;本來認…

java 自動化測試_java寫一個自動化測試

你模仿購物車試一下&#xff0c;同樣是買東西&#xff0c;加上勝負平的賠率&#xff0c;輸出改下應該就可以了package com.homework.lhh;import java.util.ArrayList;import java.util.Comparator;import java.util.Scanner;public class Ex04 {public static void main(String…

超大規模集成電路_納米級超大規模集成電路芯片低功耗物理設計分析(二)

文 | 大順簡要介紹了功耗的組成&#xff0c;在此基礎上從工藝、電路、門、系統四個層面探討了納米級超大規模集成電路的低功耗物理設計方法。關鍵詞&#xff1a;納米級&#xff1b;超大規模集成電路&#xff1b;電路芯片&#xff1b;電路設計02納米級超大規模集成電路芯片低功耗…

java中的printnb_javaI/O系統筆記

1、File類File類的名字有一定的誤導性&#xff1b;我們可能認為它指代的是文件&#xff0c;實際上卻并非如此。它既能代表一個特定文件的名稱&#xff0c;又能代表一個目錄下的一組文件的名稱。1.1、目錄列表器如果需要查看目錄列表&#xff0c;可以通過file.list(FilenameFilt…

outlook反應慢的原因_保險管怎么區分慢熔和快熔?

保險絲快熔與慢熔的區別所有雙帽;對于這樣的產品特性和安全性熔絲; gG的”&#xff0c;即&#xff0c;與接觸帽組合接觸;即&#xff0c;所述雙(內/外蓋)的蓋。和一般的小型或地下加工廠&#xff0c;以便執行切割角&#xff0c;降低生產成本&#xff0c;這將選擇單個帽鉚接“單&…