public:is_a 模板类继承的几种简单常见的模式

本文介绍了四种常见的模板类继承模式:普通类继承模板类、类模板继承模板类、类模板继承类模板以及普通类继承类模板,并详细解释了每种模式的特点及用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于最常见的public继承,有几种常见的模式,下面做一个简单的介绍。先贴出模板基类。

template<typename T>
class base
{
private:
	T value;
public:
	base(T t) :value(t){};
	base() :value(10){};
	~base(){};
	void show(){ cout << "value:" << value << endl; };
};

在具体介绍之前,先简单聊一下我理解的模板类和类模板,这就好比函数指针与指针函数,指针数组与数组指针的关系一样,二者显然是截然不同的。模板类顾名思义是一种确定的类型,例如base<int>,模板类的地位是等同于其他类的,其他类我们也可以起个名字,对比于模板类,我们称之为普通类。而类模板,是一个模板,上述的定义就是一个模板,一个关于类的模板(我的理解,如有不同观点还望指正)。

下面回到正题,第一种是普通类继承了一个模板类。

class s1 :public base<int>
{
private:
	string name;
public:
	s1(int t, const string& n1) :base(t), name(n1){};
	inline void show(){ cout << "name:" << name << endl; base::show(); };
	~s1(){};
};
实际上就等同于继承了一个普通的类,因为模板参数已经给出,派生类也不再需要template模板了,因此很类似于普通类继承普通类。public继承,在派生类里访问基类的public数据需要用base::运算符。

第二种是类模板继承模板类。

template<typename T>
class s2 :public base<int>
{
private:
	T value;
public:
	s2(int n1, T t) :base(n1), value(t){};
	s2(const base& b, T t) :base(b), value(t){};
	~s2(){};
	void show(){ cout << "value_inherit:" << value << endl; base::show(); };
};
这里和上面也是大同小异,无非继承者是个类模板。

第三种是类模板继承了一个模板。

template<typename T,typename G>
class s3 :public G
{
private:
	T value;
public:
	s3(T t) :G(), value(t){};
	~s3(){};
	void show(){ cout << "value_inherit:" << value << endl; G::show(); };
};

这个地方,因为编译的时候不了解基类的格式,因此在构造的时候只能使用默认的构造函数。

第四种是普通类继承了一个类模板。

template<typename T>
class s4 :public base<T>
{
private:
	T value;
public:
	s4(T t1, T t2) :base(t1), value(t2){};
	s4(const base<T>& bs, T vl) :base(bs), value(vl){};
	~s4(){};
	void show(){ cout << "value_inherit:" << value << endl; base<T>::show(); };
};





#include "../utils.h" #include "StringLengthVariance.h" #include <algorithm> #include <vector> std::vector<std::shared_ptr<StringBase>> StringLengthVariance::mutated_elements; StringLengthVariance::StringLengthVariance(std::shared_ptr<StringBase> obj, std::mt19937 &rand) : IntegerVariance(std::static_pointer_cast<StringBase>(obj), rand, false) {} std::pair<int64_t, int64_t> StringLengthVariance::get_limits(std::shared_ptr<StringBase> obj) { /* TODO:获取长度边界代码待完善 */ int64_t max_output_size_bits = static_cast<int64_t>(obj->mutator_config.max_output_size * 8); int64_t size_bits = llrint(obj->calculate_bit_size()); int64_t limit_bits = std::max(max_output_size_bits, size_bits); int64_t limit_bytes = (limit_bits + 7) / 8; int64_t max_length = limit_bytes; if (obj->max_length != nullptr) { max_length = std::min(limit_bytes, static_cast<int64_t>(obj->max_length.value())); } int64_t min_length = 0; if (obj->min_length.has_value()) { min_length = std::max(0LL, static_cast<int64_t>(obj->min_length.value())); } return {min_length, max_length}; } int64_t StringLengthVariance::get_value(std::shared_ptr<StringBase> obj) { return std::min(static_cast<int64_t>(obj->value.size()), max_); } void StringLengthVariance::perform_mutation(std::shared_ptr<StringBase> obj, int64_t value) { obj->mutated_value = expand(obj->value, static_cast<size_t>(value)); obj->mutated = true; mutated_elements.push_back(obj); } bool StringLengthVariance::supported(std::shared_ptr<StringBase> obj) { return std::dynamic_pointer_cast<StringBase>(obj) != nullptr; } std::vector<std::shared_ptr<StringBase>> StringLengthVariance::get_mutated_elements() { return mutated_elements; }报错/data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp: In member function ‘virtual std::pair<long int, long int> StringLengthVariance::get_limits(std::shared_ptr<StringBase>)’: /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:24:25: error: request for member ‘has_value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::max_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 24 | if (obj->max_length.has_value()) { | ^~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:25:81: error: request for member ‘value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::max_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 25 | max_length = std::min(limit_bytes, static_cast<int64_t>(obj->max_length.value())); | ^~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:28:25: error: request for member ‘has_value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::min_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 28 | if (obj->min_length.has_value()) { | ^~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:29:73: error: request for member ‘value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::min_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 29 | min_length = std::max(0LL, static_cast<int64_t>(obj->min_length.value())); | ^~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp: At global scope: /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:48:42: error: no declaration matches ‘std::vector<std::shared_ptr<StringBase> > StringLengthVariance::get_mutated_elements()’ 48 | std::vector<std::shared_ptr<StringBase>> StringLengthVariance::get_mutated_elements() { | ^~~~~~~~~~~~~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:48:42: note: no functions named ‘std::vector<std::shared_ptr<StringBase> > StringLengthVariance::get_mutated_elements()’ In file included from /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:6: /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.h:13:7: note: ‘class StringLengthVariance’ defined here 13 | class StringLengthVariance : public IntegerVariance { | ^~~~~~~~~~~~~~~~~~~~
07-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值