當派生類只添加非虛函數時,將基類轉換為派生類

馬修M。

假設我有一些類似的東西:

class Base {
public:
  Base(int value) : value_(value) {}
  int getValue() const { return value_; }
private:
  int value_;
};

class Derived : public Base {
public:
  // Derived only has non-virtual functions. No added data members.
  int getValueSquared() const { return value_ * value_; }
}

我執行以下操作:

Base* base = new Base(42);
Derived* derived = static_cast<Derived*>(base);
std::cout << derived->getValueSquared() << std::endl;

嚴格來說,這是UB。實際上,它工作得很好。

來自 Base 的實際數據成員(例如,int value_)必須位於相同的偏移量,無論對像是實際的Base還是實際的Derived(否則,祝你好運)。並且getValueSquared()不是Derived實例實際內存佔用的一部分,因此它不會從內存中的 Base 對像中“丟失”或未構建。

我知道 UB 是我不需要這樣做的全部原因,但從邏輯上講,它似乎總是有效。那麼,為什麼不呢?

我問是因為這似乎是一個有趣的怪癖討論......不是因為我打算在生產中使用它。

馬克·蘭森

在實踐中,大多數編譯器會將非虛成員函數轉換為帶有隱藏this參數的靜態函數只要函數不使用任何不屬於基類的數據成員,它就可能會起作用。

UB 的問題在於你無法預測它。昨天有效的東西今天可能會失敗,背後沒有韻律或原因。編譯器在如何解釋技術上未定義的任何內容方面有很大的自由度,而尋找更好優化的競賽意味著意外的變化可能會突然發生。墨菲定律說,當您向最重要的老闆或最大的客戶演示軟件時,這些變化將最為明顯。

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

將派生的 QList 轉換為基類的 QList

在 Django 項目中將表單函數轉換為基於類的視圖

打字稿轉換 Object.entries 將派生的字符串數組簡化為文字類型

將 UML 轉換為代碼 C++。繼承問題。當任何一個類的對像被創建時,所有類的構造函數都會運行嗎?

如何使用函數構造函數將類組件轉換為函數式?

將函數組件轉換為類組件

Pandas 為 pyspark 數據框應用函數替代(想要將整數數據類型列轉換為列表數據類型)

將基於類的 js useState 數組轉換為 typescript Hook 問題

Spark sql 在進行數據類型轉換時將壞記錄轉換為 Null

將 C# 類轉換為他的子類

當映射到 POJO 中的 Double 類型字段時,Jackson ObjectMapper 將 Integer 值轉換為 null

將 React 庫添加到網站時,如何將類組件轉換為功能組件?

在 R 中使用 NA 將數據、類字符轉換為數字

在列表列表中,是否可以將特定項轉換為 int 數據類型、float 數據類型和 str 數據類型

如何將字符串類型列轉換為熊貓數據框中的列表類型?

將具有泛型類型參數的結構轉換為特定類型

將 varchar 轉換為數字類型的算術溢出錯誤 - SQL Server

將帶有小時的列轉換為日期時間類型的熊貓

也將枚舉類轉換為 std::tuple

將json文件轉換為python類

React 將 Hook 轉換為類但出錯

如何將類似日期時間的字符串轉換為毫秒

將 YYYYMMDDHHMMSS 轉換為 r 中的日期和時間類

無法將 Observable<Store> 類型的類型值轉換為預期的參數類型 Observable<Store?>

無法從虛方法覆蓋中的派生訪問基類字段

在我的 SQL Server 存儲過程中將數據類型 varchar 轉換為數字時出錯

將包含數字的字符串轉換為數字數據類型的問題

使用回調函數將子類擴展為超類

如何將字符串文字類型轉換為新類型的鍵?

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  3. 3

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  4. 4

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  5. 5

    Gerenciar recurso shake de Windows Aero com barra de título personalizado

  6. 6

    Como obter dados API adequados para o aplicativo angular?

  7. 7

    UITextView não está exibindo texto longo

  8. 8

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  9. 9

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  10. 10

    Usando o plug-in Platform.js do Google

  11. 11

    Como posso modificar esse algoritmo de linha de visada para aceitar raios que passam pelos cantos?

  12. 12

    Dependência circular de diálogo personalizado

  13. 13

    Coloque uma caixa de texto HTML em uma imagem em uma posição fixa para site para desktop e celular

  14. 14

    iOS: como adicionar sombra projetada e sombra de traço no UIView?

  15. 15

    Como usar a caixa de diálogo de seleção de nomes com VBA para enviar e-mail para mais de um destinatário?

  16. 16

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  17. 17

    How to create dynamic navigation menu select from database using Codeigniter?

  18. 18

    Converter valores de linha SQL em colunas

  19. 19

    ChartJS, várias linhas no rótulo do gráfico de barras

  20. 20

    用@StyleableRes注释的getStyledAttributes。禁止警告

  21. 21

    não é possível adicionar dependência para com.google.android.gms.tasks.OnSuccessListener

quentelabel

Arquivo