由C 的多型想到 C 與Golang的一點區別

2021-09-27 02:46:37 字數 1917 閱讀 7511

多型

有種說法,golang沒有多型/繼承,它叫組合,比如:

type base struct 

func (b *base) sayhello()

func (b *base) hello()

type deverived struct

func (d *deverived) hello()

func testdeverived()

func main()

將輸出,

base hello
為什麼呢?因為在testdeverived函式中,d的型別雖然是deverived,但deverived沒有實現sayhello方法,而在基類base的sayhello方法中,此時型別是*base,因此呼叫的會是基類的hello方法。

c++與golang的map的區別

golang map是hash map, 而c++ map是red-black-tree map;

golang map是無序的, 且每次遍歷不穩定一致, 而c++ map是有序的, 且每次遍歷穩定一致,這個可以從**運**況看出:

func testmap() 

for key, _ := range m

}

以上**多次執行的結果有可能不一樣。

c++中的多型需要幾個條件:

基類函式前加上virtual;

子類實現同名函式,包括函式返回值,函式引數型別和引數個數都要一致;

虛函式是動態多型(好像有相對的靜態多型),是在執行時才確定的行為。

// base.h

#ifndef base_h

#define base_h

class base

;#endif // base_h

// base.cpp

#include "base.h"

#include using namespace std;

base::base()

void base::sayhi()

deverived::~deverived()

{ cout<<__func__《以上**中,sayhi有用virtual修飾,是虛函式,而func沒有用virtual修飾,不是虛函式,func的輸出取決於呼叫物件的型別,觀察如下**輸出:

base *b = new deverived();

b->sayhi();

b->func();

deverived *d = new deverived();

d->sayhi();

d->func();

i'm deverived

base::func()

i'm deverived

deverived::func()

參考

q:類建構函式可以是虛函式嗎?q:為什麼析構函式可以為虛函式,如果不設為虛函式可能會存在什麼問題?

a:首先析構函式可以為虛函式,而且當要使用基類指標或引用呼叫子類時,最好將基類的析構函式宣告為虛函式,否則可以存在記憶體洩露的問題。

舉例說明:

子類b繼承自基類a;a *p = new b; delete p;

1) 此時,如果類a的析構函式不是虛函式,那麼delete p;將會僅僅呼叫a的析構函式,只釋放了b物件中的a部分,而派生出的新的部分未釋放掉。

2) 如果類a的析構函式是虛函式,delete p; 將會先呼叫b的析構函式,再呼叫a的析構函式,釋放b物件的所有空間。

補充: b *p = new b; delete p;時也是先呼叫b的析構函式,再呼叫a的析構函式。

參考

由STL的Adapter介面卡想到C 多型

這幾天疫情在家閒來無聊,翻開許久沒看的stl開始復讀起來。mem fun ref這個函式印象很深。屬於function adapter。最常見的用法 include include include include include using namespace std class base virt...

java之由多型想到的 文本版

多型 簡單理解就是 父類變數 指向子類物件 對介面來說 1.定義介面 2.建立子類物件,3.定義方法,並用介面型別變數做形式引數 4.呼叫方法.對類來說 1.定義父類 2.建立子類物件,3.定義方法,並用父類型別變數做形式引數 4.呼叫方法.多型的好處 提高了 的擴充套件性,前期定義的 可以使用後期...

由一道C 題所想到的

前段時間在睿思上 vivianliu出了如下一道c 題目 給定乙個類 class mycl protected virtual int geta int main 可見輸出是乙個未初始化的a。先上 吧 class myder mycl 同樣是派生乙個子類 int main 為下文修改記憶體分配策略 ...