[英]std::shared_ptr and Inheritance
我在繼承類的shared_ptr
之間進行自動類型轉換時遇到了一些問題。
我的類結構如下,一個基類Base
和兩個派生類Derived1
和Derived2
。
// Base class
class Base {
protected:
...
...
public:
Base() = default;
virtual ~Base() = default;
virtual void run() = 0;
...
...
};
// Derived class
class Derived1: Base {
protected:
...
...
public:
Derived1() = default;
virtual ~Derived1() = default;
void run() {...}
...
...
};
// Derived class
class Derived2: Base {
protected:
...
...
public:
Derived2() = default;
virtual ~Derived2() = default;
void run() {...}
...
...
};
我有一個函數doSomething()
void doSomething(std::shared_ptr<Base> ptr) {
ptr->run();
...
}
我用這樣的派生類調用函數 -
doSomething(make_shared<Derived1>())
doSomething(make_shared<Derived2>())
但我得到一個錯誤說 -
no viable conversion from 'shared_ptr<class Derived1>' to 'shared_ptr<class Base>'
no viable conversion from 'shared_ptr<class Derived1>' to 'shared_ptr<class Base>'
我究竟做錯了什么? 將static_pointer_cast
用於Base類型是否安全? 喜歡 -
doSomething(static_pointer_cast<Base>(make_sahred<Derived2>()))
解決方案我的不好......問題是我私下繼承了基類。
據我所知,您提供的代碼編譯得很好: http : //ideone.com/06RB2W
#include <memory>
class Base {
public:
Base() = default;
virtual ~Base() = default;
virtual void run() = 0;
};
class Derived1: public Base {
public:
Derived1() = default;
virtual ~Derived1() = default;
void run() {}
};
class Derived2: public Base {
public:
Derived2() = default;
virtual ~Derived2() = default;
void run() {}
};
void doSomething(std::shared_ptr<Base> ptr) {
ptr->run();
}
int main() {
doSomething(std::make_shared<Derived1>());
doSomething(std::make_shared<Derived2>());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.