C++ 有没有一种方法可以禁止对C+中非常量的子类进行强制转换+;?

C++ 有没有一种方法可以禁止对C+中非常量的子类进行强制转换+;?,c++,inheritance,constants,C++,Inheritance,Constants,这是一个完整的例子。 我想通过只允许强制转换来禁止从B强制转换为A的对象使用A::set B到常数A。 怎么做? (我不能使用虚拟函数) #包括 #包括 使用名称空间std; 甲级{ 公众: int get()常量{return i_;} 空集(inti){i_uu=i;} 受保护的: 国际组织; }; B类:公共A{ 公众: int ok()常量{返回A::get()==复制 空集(inti){A::set(i);copy_i_=i;} 受保护的: int copy_i_; }; void t

这是一个完整的例子。 我想通过只允许强制转换来禁止从B强制转换为A的对象使用A::set B到常数A。 怎么做? (我不能使用虚拟函数)

#包括
#包括
使用名称空间std;
甲级{
公众:
int get()常量{return i_;}
空集(inti){i_uu=i;}
受保护的:
国际组织;
};
B类:公共A{
公众:
int ok()常量{返回A::get()==复制
空集(inti){A::set(i);copy_i_=i;}
受保护的:
int copy_i_;
};
void test2(){
A A;
a、 set(3);//这里可以

无法为什么强制转换?将void A::set(int i)设置为受保护将在您的情况下起作用。

没有必要禁止非常量强制转换。您可以通过使用解决问题

#包括“stdafx.h”
#包括
#包括
使用名称空间std;
甲级{
公众:
int get()常量{return i_;}
空集(inti){assert(i_u=i);copy_i();}
受保护的:
国际组织;
虚拟无效副本_i(){};
};
B类:公共A{
公众:
int ok()常量{返回A::get()==复制
受保护的:
int copy_i_;
无效复制_i(){copy_i_=i_;}
};
void test2(){
B B;
b、 组(5);
A&A=b;
断言(b.ok());
a、 组(3);
断言(b.ok());//成功!
}
int main(){
test2();
返回0;
}

您可以将继承设置为私有的,并在B中提供一个成员函数来代替强制转换

const A& B::convert_to_A() const { return *this; }

但我想修改纯A对象。正如我所说的,由于性能原因,我不能使用虚拟函数。如果类A可以保持不变,那就太好了。在这种情况下,我认为这是不可能的。但是你是否真的分析了你的应用程序,以确保虚拟函数太慢?虚拟函数的开销通常是负的ligible。我做了配置文件。虚拟函数太慢,因为它们无法内联。A::set()中的assert()可能无法执行您想要的操作。它将在参数为0的调用中命中。这正是我需要的,谢谢。
#include "stdafx.h"
#include <iostream>
#include <cassert>

using namespace std;

class A {
public:
  int  get() const { return i_; }
  void set(int i) { assert(i_ = i); copy_i();}

protected:
  int i_;
  virtual void copy_i(){};
};


class B : public A {
public:
  int  ok() const { return A::get() == copy_i_; }
protected:
  int copy_i_;
  void copy_i(){copy_i_ = i_; }
};

void test2() {
  B b;
  b.set(5);
  A& a = b;
  assert(b.ok());
  a.set(3);
  assert(b.ok()); // success!
}

int main() {
  test2();
  return 0;
}
const A& B::convert_to_A() const { return *this; }