考慮一個用例:是否可以阻止引用的上傳?
- 你已經有了一個可複製類
Base
,對於你真的不關心會發生什麼吧。 - 從此公開繼承是
Derived
類,該類不應轉換爲Base
。一點也不。甚至沒有提及它,參考Base
,換句話說,隱式地綁定應該是非法的:Derived& -> Base&
。
注:Derived
類可以是可複製,只是它的內部永遠也不會被放入一個普通Base
對象。由於可以直接禁止從Derived
開始禁止Base
的初始化,所以如果編譯可以被禁止繞過它,問題仍然存在:Derived& -> Base& -> Base
。
假設static_cast
,指針不是一個問題 - 只在函數調用中自動綁定。
下面是該問題的一個基本的例子:
#include <iostream>
using namespace std;
class Derived;
class Base
{
public:
Base(int var)
: m_var(var)
{
std::cout << "Base default ctor with value: " << m_var << std::endl;
}
Base& operator=(const Derived&) = delete;
Base& operator=(Derived&&) = delete;
Base(const Derived&) = delete;
Base(Derived&&) = delete;
int m_var;
};
class Derived : public Base
{
public:
Derived(int var)
: Base(var)
{
std::cout << "Derived default ctor with value: " << m_var << std::endl;
}
Base unprotect() const
{
std::cout << "Derived unprotected with value: " << m_var << std::endl;
return Base(m_var);
}
};
void foo(Base& base)
{
std::cout << "foo with value: " << base.m_var << std::endl;
// Base b2 = base; // just copied Derived, goal is to prohibit it!
}
int main()
{
Base b1(1);
foo(b1);
Derived d1(2);
foo(d1); // is it at all possible to disallow implicit Derived& -> Base&?
// rationale is to require explicit: Base& Dervied::getBaseRef()
// Base b2 = d1; // illegal: error: use of deleted function 'Base::Base(const Derived&)'
return 0;
}
_「從它公開繼承是Derived類,它不應該轉換爲Base。」_爲什麼它繼承'Base'呢?這聽起來很奇怪。 –
它似乎更像是一個設計問題而不是代碼問題。 –
@πάνταῥεῖ由於基於'Base' *的不幸的大型代碼*基礎,其中明確的轉換仍將被使用,但是您可以更輕鬆地保留它們的軌跡*。 – hauron