gpt4 book ai didi

c++ - 是否可以阻止引用的向上转换?

转载 作者:搜寻专家 更新时间:2023-10-30 23:53:46 27 4
gpt4 key购买 nike

考虑一个用例:

  • 你有一个可复制的类 Base,你并不真正关心它会发生什么。
  • 从它公开继承的是一个 Derived 类,该类不应转换为 Base。一点也不。甚至没有对它的引用,对 Base 的引用,换句话说,隐式绑定(bind)应该是非法的:Derived& -> Base&

注意:Derived 类是可复制的,只是它的内部永远不应该放入常规的 Base 对象中。由于可以直接禁止从 Derived 初始化 Base,所以问题仍然是是否可以禁止编译绕过它:Derived& -> Base& -> Base.

假设 static_cast,指针不是问题 - 只是函数调用中的自动绑定(bind)。

这是一个显示问题的基本示例:

#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;
}

最佳答案

inheriting publicly from it is a Derived class, which should not be convertible to Base. Not at all.

从 OOP 设计的角度来看,这两件事非常矛盾。我认为语言中没有一种方法可以防止将派生对象视为公共(public)基础(通过引用的隐式转换)。

您可以改为非公开地继承 Base

这也将阻止显式转换 - 您仍然希望能够这样做 - 同样。但仅限于类范围之外。您可以改为提供一个成员来访问基本实例:

class Derived : Base
{
public:
// ...
Base& base() {
return *this;
}
};

现在,您可以通过调用 Derived::base 来替换那些显式转换,这仍然是允许的,而隐式转换则不允许。

Derived d;
Base& b = d; // (implicit) conversion fails
Base& b = d.base(); // this works

您可能还想实现该函数的 const 版本。我将把它留作练习。

关于c++ - 是否可以阻止引用的向上转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38398435/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com