这是一个完整的例子。 我想禁止使用A :: set从从B转换为A的对象,只允许转换 B到const A. 怎么做? (我不能使用虚函数)
#include <iostream>
#include <cassert>
using namespace std;
class A {
public:
int get() const { return i_; }
void set(int i) { i_ = i; }
protected:
int i_;
};
class B : public A {
public:
int ok() const { return A::get() == copy_i_; }
void set(int i) { A::set(i); copy_i_ = i; }
protected:
int copy_i_;
};
void test2() {
A a;
a.set(3); // ok here
cout << a.get() << endl;
B b;
b.set(5);
A& aa = b;
assert(b.ok());
aa.set(3); // not ok here
assert(b.ok()); // fail-here
}
int main() {
test2();
return 0;
}
答案 0 :(得分:2)
您可以将继承设为私有,并在B中提供成员函数以使用而不是强制转换。
const A& B::convert_to_A() const { return *this; }
答案 1 :(得分:0)
为什么要施法?使void A :: set(int i)受保护将适用于您的情况。
答案 2 :(得分:0)
没有必要禁止非const演员表。您可以使用template method design pattern解决问题。
#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;
}